- P30's solution
P30's Solution
- 2025-9-4 21:59:21 @
直接高精度模拟即可。
#include<bits/stdc++.h>
using namespace std;
char s[610];
int point=-1;
int Cnt=0;
namespace mysqrt
{
char jg[610]={'0'};
int cnt=0;
int l=0;
int work(int o,char *O,int I)
{
char c,*D=O;
if(o>0)
for(l=0;D[l];D[l++]-=10)
{
D[l++]-=120;
D[l]-=110;
while(!work(0,O,l))
D[l]+=20;
jg[++cnt]=(D[l]+1032)/20;
}
else
{
c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
}
return o;
}
char* bigsqrt(char *S,int k)
{
char *ss=S;
memset(jg,'\0',sizeof(jg));
jg[0]='0';
cnt=0;
int CNT=Cnt;
for(;Cnt<CNT+2*k;) ss[++Cnt]='0';
if(strlen(ss)&1)
work(2,ss+1,0);
else
work(2,ss,0);
point=cnt-k;
for(int i=1;i<=point;i++) jg[i]='0';
return jg;
}
}
using namespace mysqrt;
int n,k;
char x;
char *s1;
int ans1,ans2;
int main()
{
cin>>n>>k>>x;
for(int i=2;i<=k;i++)
{
int tmp=sqrt(i);
// if(tmp*tmp==i) continue;
memset(s,'\0',sizeof(s));
s[0]='0';
cnt=Cnt=0;
point=-1;
snprintf(s,sizeof(s),"%d",i);
s[strlen(s)]='0';
Cnt=strlen(s)-1;
for(int i=strlen(s)-1;i>0;i--) swap(s[i],s[i-1]);
s1=bigsqrt(s,n+1);
int tmm=strlen(s1)-1;
while(s1[tmm]>=53)
{
s1[tmm-1]++,s1[tmm]=48,--tmm;
if(s1[tmm]!=':') break;
}
s1[strlen(s1)-1]='\0';
for(int j=point+1;j<strlen(s1);j++)
{
if(s1[j]==x) ans1++;
ans2+=s1[j]-48;
}
}
cout<<ans1<<endl<<ans2;
return 0;
}