打表找规律,人品爆发发现公式2^(n+2)-5根据样例套出,然后直接就A了。。。
题解很强:
题目大意: 汉诺塔的变形,每种大小的汉诺塔变成了两个,问这两个结果顺序无所谓和顺序有不变的的移动步数各为多少?
做法:递推,不过估计很多人都是找规律找出来的。
对于n种大小盘子的,设顺序无关系的步数为f(n),顺序有关的步数为g(n),首先,对于一个大小的盘子,很容易理解,显然,f(1)=2,g(1)=3。
对于顺序无关的,我们很容易想到这个递推式:
f(n)=f(n−1)+2+f(n−1)f(n)=f(n−1)+2+f(n−1)
同时,我们可以观察到,每调用一次这个方法,最大的两个顺序会反转,所以调用偶数次时,顺序不会变化,保证这里是偶数次后,由于后面的递推的项也是偶输次,所以也是可以保证的,因此,我们可以有以下的递推式:
g(n)=f(n−1)+2+f(n−1)+2+g(n−1)g(n)=f(n−1)+2+f(n−1)+2+g(n−1)
或者:
g(n)=f(n − 1)+1 + f(n − 1)+1 + f(n − 1)+1 + f(n − 1)
所以之后递推一下就好了,很容易通过预处理或者快速幂都可以,前者在1s内没问题,后面的需要2s多,后来还是没有卡快速幂的,时间放宽了。
#include<cstdio>
#include<cstring>
#define mod 233333333
int n;
long long ans1,ans2;
long long qp(int x,int num)
{
long long ans=1,cnt=num;
while(x)
{
if(x%2==1)
ans=(ans*cnt)%mod;
cnt=(cnt*cnt)%mod;
x>>=1;
}
return ans;
}
int main()
{
int t;
while(~scanf("%d",&n))
{
ans1=1;ans2=1;
ans1=qp(n+1,2);ans2=qp(n+2,2);
ans1=(ans1-2)%mod;ans2=(ans2-5)%mod;
if(ans1<0)
ans1+=mod;
if(ans2<0)
ans2+=mod;
printf("%lld %lld\n",ans1,ans2);
}
return 0;
}