1 条题解
-
0
直接高精度模拟即可。
#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; }
- 1
信息
- ID
- 65
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 6
- 已通过
- 3
- 上传者