xtu1238 01字符串

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]);
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值