Source Code
Problem: 1238 User: 2022********
Memory: 9036K Time: 46MS
Language: G++ Result: Accepted
Source Code
#include<stdio.h>
#define MO 1000000007
#define N 1000000
typedef __int64 lld;
lld dp[1000010];//开大点安全
int main()
{
dp[1] = 0;//null
dp[2] = 1;//11 10 01 00
// dp[3]=dp[2](第三位是0 11->011)+dp[1](第三位是1,但第二位是0 01->101 00->100,由上个情况可知,第二位
//为0的情况数为dp[1])+2^[i-2]
dp[3] = 3;//111(1+11) 110(1+10) 101(1+01) 100 011 010 001 000 1+0+2^1
lld str2 = 4;
for (lld i = 4; i <=N ; i++)
{
// 一开始这么想dp[i] = (dp[i - 1] + dp[i - 2] + (1 << i-2)%MO)%MO;
// 1<<1=2,1<<2=4(左移运算符快速计算2的次方1<<n=2^n)当然,2的100000次方肯定会炸
dp[i] = (dp[i - 1] + dp[i - 2] + str2)%MO;
str2 = (str2 * 2) % MO;
}
int K;
scanf("%d", &K);
while (K--)
{
int n;
scanf("%d", &n);
printf("%I64d\n", dp[n]);
}
}
xtu1238 01字符串
最新推荐文章于 2024-09-01 15:17:25 发布