一道数学题目
题意为给出折纸的过程,问最后摊开后朝向自己突出的折痕个数。
仔细思考后发现左折和右折效果一样,同理上下折也一样。
情况分2种。
第一种:只折一次。
结果答案都是0.
第二种:折多次。
先讨论第一次是上下折。
折完第一次后继续折,设左右折n次,上下折m次。
摊开后,不难发现答案 就是第一次折的的那条中线上方所含的边数,(不包含纸的边缘和中线)
竖边数=(2^n-1)*2^m.
横边数=(2^m-1)*2^n.
答案就是(2^n-1)*2^m+(2^m-1)*2^n。
而第一次是左右折折也可得出相同的结论。
#include<iostream>
#include<cstdio>
using namespace std;
#define mod 100000009
char ch[1000009];
int main()
{
int i,t;
long long ans,z,s;
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",ch);
z=1;
s=1;
for(i=1;ch[i]!='\0';i++)
{
if(ch[i]=='L'||ch[i]=='R')
{
if(z*2>=mod)
z=z*2%mod;
else
z=z*2;
}
else//(ch[i]=='U'||ch[i]=='D')
{
if(s*2>=mod)
s=s*2%mod;
else
s=s*2;
}
}
if(s==1&&z==1)
printf("0\n");
else
{
ans=((s-1)*z%mod+(z-1)*s%mod)%mod;
printf("%lld\n",ans);
}
}
return 0;
}