找循环节,肯定在40项以内,不会证明。
#include <iostream> #include <cstring> #include <string> #include <map> using namespace std; long long a[105]; map<long long,bool>m; int main() { long long t; cin>>t; for(long long o=1;o<=t;o++) { m.clear(); long long n;//n的范围很大,用long long cin>>a[1]>>a[2]>>n; m[a[1]]=1; m[a[2]]=1; long long x,y; long long r,l; for(long long i=3;i<=105;i++) { x=0,y=0; long long xx=a[i-1]; long long yy=a[i-2]; while(xx>=10) { x+=xx%10; xx=xx/10; } x+=xx; while(yy>=10) { y+=yy%10; yy=yy/10; } y+=yy; a[i]=x+y; if(!m[a[i]]) m[a[i]]=1; else if(m[a[i]]&&m[a[i-1]]) { r=i-2; bool f=0; for(long long j=2;j<=i-1;j++) { if(a[i]==a[j]&&a[i-1]==a[j-1]) { l=j-1; f=1; break; } } if(f) break; } } cout<<"Case #"<<o<<": "; if(n<=r) cout<<a[n]<<endl; else { long long u=r-l+1; n=n-l+1; n=n%u; if(n==0) cout<<a[r]<<endl;//特判,wa了好几次 else cout<<a[l-1+n]<<endl; } } return 0; }
找循环节,肯定在40项以内,不会证明。
#include <iostream> #include <cstring> #include <string> #include <map> using namespace std; long long a[105]; map<long long,bool>m; int main() { long long t; cin>>t; for(long long o=1;o<=t;o++) { m.clear(); long long n;//n的范围很大,用long long cin>>a[1]>>a[2]>>n; m[a[1]]=1; m[a[2]]=1; long long x,y; long long r,l; for(long long i=3;i<=105;i++) { x=0,y=0; long long xx=a[i-1]; long long yy=a[i-2]; while(xx>=10) { x+=xx%10; xx=xx/10; } x+=xx; while(yy>=10) { y+=yy%10; yy=yy/10; } y+=yy; a[i]=x+y; if(!m[a[i]]) m[a[i]]=1; else if(m[a[i]]&&m[a[i-1]]) { r=i-2; bool f=0; for(long long j=2;j<=i-1;j++) { if(a[i]==a[j]&&a[i-1]==a[j-1]) { l=j-1; f=1; break; } } if(f) break; } } cout<<"Case #"<<o<<": "; if(n<=r) cout<<a[n]<<endl; else { long long u=r-l+1; n=n-l+1; n=n%u; if(n==0) cout<<a[r]<<endl;//特判,wa了好几次 else cout<<a[l-1+n]<<endl; } } return 0; }