校赛热身 Problem B. Matrix Fast Power

时间:2022-05-28 15:33:43

校赛热身 Problem B. Matrix Fast Power

找循环节,肯定在40项以内,不会证明。

#include <iostream>
#include <cstring>
#include <string>
#include <map>
using namespace std;
long long a[];
map<long long,bool>m;
int main()
{
long long t;
cin>>t;
for(long long o=;o<=t;o++)
{
m.clear();
long long n;//n的范围很大,用long long
cin>>a[]>>a[]>>n;
m[a[]]=;
m[a[]]=;
long long x,y;
long long r,l;
for(long long i=;i<=;i++)
{
x=,y=;
long long xx=a[i-];
long long yy=a[i-];
while(xx>=)
{
x+=xx%;
xx=xx/;
}
x+=xx;
while(yy>=)
{
y+=yy%;
yy=yy/;
}
y+=yy;
a[i]=x+y;
if(!m[a[i]]) m[a[i]]=;
else if(m[a[i]]&&m[a[i-]])
{
r=i-;
bool f=;
for(long long j=;j<=i-;j++)
{
if(a[i]==a[j]&&a[i-]==a[j-])
{
l=j-;
f=;
break;
} }
if(f) break;
}
}
cout<<"Case #"<<o<<": ";
if(n<=r) cout<<a[n]<<endl;
else
{
long long u=r-l+;
n=n-l+;
n=n%u;
if(n==) cout<<a[r]<<endl;//特判,wa了好几次
else cout<<a[l-+n]<<endl;
}
}
return ;
}