http://codeforces.com/problemset/problem/863/C
根据题意找循环节,然后求和。
#include<iostream>
#include<map>
using namespace std;
long long int an1=0,an2=0;
void did(long long int x,long long int y)
{
if(x==1)
{
if(y==2)an2++;
if(y==3)an1++;
}
else if(x==2)
{
if(y==3)an2++;
if(y==1)an1++;
}
else if(x==3)
{
if(y==1)an2++;
if(y==2)an1++;
}
}
int main(){
long long int k;
long long int a,b;
long long int a1[4][4],b1[4][4];
while(cin>>k>>a>>b)
{
long long int i,j;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
cin>>a1[i][j];
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
cin>>b1[i][j];
map<long long int,long long int> xh;
an1=0;an2=0;
k--;
did(a,b);
long long int za,zb;
long long int fa,fb;
xh[a*10+b]=1;
long long int xhj;
long long int js=k+1;
while(k--)
{
za=a1[a][b];
zb=b1[a][b];
if(xh[za*10+zb]==0)
{
xh[za*10+zb]=xh[a*10+b]+1;
did(za,zb);
a=za;b=zb;
}
else {
fa=za;fb=zb;
xhj=xh[a*10+b]+1-xh[za*10+zb];
break;
}
}
if(k>=1)
{
k++;
long long int cs=k/xhj;
long long int sxd=k%xhj;
long long int sa=0,sb=0;
long long int aaa=fa,bbb=fb;
if(fa==1)
{
if(fb==2)sb++;
if(fb==3)sa++;
}
else if(fa==2)
{
if(fb==3)sb++;
if(fb==1)sa++;
}
else if(fa==3)
{
if(fb==1)sb++;
if(fb==2)sa++;
}
for(i=1;i<=xhj-1;i++)
{
aaa=a1[fa][fb];
bbb=b1[fa][fb];
if(aaa==1)
{
if(bbb==2)sb++;
if(bbb==3)sa++;
}
else if(aaa==2)
{
if(bbb==3)sb++;
if(bbb==1)sa++;
}
else if(aaa==3)
{
if(bbb==1)sb++;
if(bbb==2)sa++;
}
fa=aaa;
fb=bbb;
}
an1+=cs*sa;an2+=cs*sb;
for(i=1;i<=sxd;i++)
{
aaa=a1[fa][fb];
bbb=b1[fa][fb];
did(aaa,bbb);
fa=aaa;
fb=bbb;
}
cout<<an1<<" "<<an2<<endl;
}
else if(k==0&&xhj==1){
did(fa,fb);
cout<<an1<<" "<<an2<<endl;
}
else {
cout<<an1<<" "<<an2<<endl;
}
}
return 0;
}