You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.2 KiB
C++
55 lines
1.2 KiB
C++
#include <cstdio>
|
|
#include <cstring>
|
|
using namespace std;
|
|
struct mat
|
|
{
|
|
int d[2][2];
|
|
const mat& operator=(const mat& rhs)
|
|
{
|
|
memcpy(this,&rhs,sizeof(rhs));
|
|
return *this;
|
|
}
|
|
const mat& operator*=(const mat& rhs)
|
|
{
|
|
mat ret;
|
|
memset(&ret,0,sizeof(ret));
|
|
for(int i=0; i<2; i++)
|
|
for(int j=0; j<2; j++)
|
|
for(int k=0; k<2; k++)
|
|
ret.d[i][j]+=d[i][k]*rhs.d[k][j],ret.d[i][j]%=7;
|
|
memcpy(this,&ret,sizeof(ret));
|
|
return *this;
|
|
}
|
|
};
|
|
template<typename T>
|
|
void fpow(T& ans,const T& a,int b)
|
|
{
|
|
for(T x=a; b; b>>=1)
|
|
{
|
|
if(b&1)
|
|
ans*=x;
|
|
x*=x;
|
|
}
|
|
}
|
|
int main()
|
|
{
|
|
int a,b,n;
|
|
while(scanf("%d%d%d",&a,&b,&n),a|b|n)
|
|
if(n<=2)
|
|
puts("1");
|
|
else
|
|
{
|
|
mat ans,mul;
|
|
ans.d[0][0]=ans.d[1][1]=1;
|
|
ans.d[0][1]=ans.d[1][0]=0;
|
|
mul.d[0][0]=a;
|
|
mul.d[0][1]=b;
|
|
mul.d[1][0]=1;
|
|
mul.d[1][1]=0;
|
|
fpow(ans,mul,n-2);
|
|
printf("%d\n",(ans.d[0][0] + ans.d[0][1]) % 7);
|
|
}
|
|
|
|
return 0;
|
|
}
|