30pts #4-#10WA求助

P1050 [NOIP2005 普及组] 循环

改ans为string后仍为30pts ```cpp #include<iostream> using namespace std; string lastnum(string s,int k){ if(s.length()<=k){ while(1){ if(s.length()<k){ s="0"+s; } else{ break; } } return s; } string res=""; for(int i=s.length()-1;i>s.length()-1-k;i--){ res=s[i]+res; } return res; } string times(string a,string b){ string c=""; if(a.length()<b.length()){ string t=a; a=b; b=t; } int x[400]={0}; int alen=a.length(); int blen=b.length(); for(int i=a.length()-1;i>=0;i--){ for(int j=b.length()-1;j>=0;j--){ x[(alen-i)+(blen-j)-1]+=((a[i]-'0')*(b[j]-'0'))%10; x[(alen-i)+(blen-j)]+=((a[i]-'0')*(b[j]-'0'))/10; } } for(int i=1;i<alen+blen+1;i++){ if(x[i]>9){ x[i+1]+=x[i]/10; x[i]=x[i]%10; } } int j=0; for(int i=alen+blen+2;i>0;i--){ if(x[i]!=0){ j=1; } if(j==1||i==1){ char num=x[i]+'0'; c=c+num; } } return c; } int main(){ int k,x[13]; string ans="1"; string n; cin>>n>>k; while(1){ if(n.length()<k){ n="0"+n; } else{ break; } } int c=0; string m,y=lastnum(n,1); while(1){ c++; string s=lastnum(n,c); m=s; for(int i=0;i<10;i++){ x[i]=0; } int t=0; while(1){ t++; m=times(m,y); m=lastnum(m,c); if(x[m[0]-'0']>0){ char d=t-x[m[0]-'0']+'0'; string f=""; f=f+d; ans=times(ans,f); string z; if(c==1){ y="1"; z=lastnum(n,c); } else{ z="1"; } for(int i=0;i<t-x[m[0]-'0'];i++){ y=times(y,z); y=lastnum(y,c+2); if(c!=1&&i==0){ z=lastnum(y,c+2); } } break; } x[m[0]-'0']+=t; } if(c==k){ break; } } if(lastnum(times(n,y),c)!=lastnum(n,c)){ cout<<-1; return 0; } cout<<ans; return 0; } ```
by ABCgfed @ 2023-06-29 10:35:13


|