ACM-ICPC 2018 徐州赛区网络预赛 A. Hard to prepare

题意:给你2^k个面具,然后n个人,要求挨着的2个人二进制之后不能互补。问你有多少不同的方案数

 

分析:经过周密的分析,可以得出每一个数只和一个特定的数异或成不可以的结果 , 那就很容易分析出

 

 

可是 1 号与4号会出现相同的情况,我们要加上这个情况 那我们就考虑将这两个合并,并将5号排除,

可以找到递推:

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int mod = 1e9 + 7;
const int MAXN = 1e6+1;
ll pow2[1000000];


ll qpow(ll a, ll b)
{
    ll ans=1;
    while(b)
    {
        if(b%2)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}

ll solve(int n, int m)
{
    ll ans;
    if(n==2)
        return pow2[m]*(pow2[m]-1)%mod;
    if(n==1)
        return pow2[m];
    ans = (pow2[m]*qpow(pow2[m]-1,n-2)%mod*(pow2[m]-2)%mod+solve(n-2,m))%mod;
    return ans;
}
int main( )
{
    int t,n,k;
    scanf("%d",&t);
   pow2[0]=1;
    for(int i=1 ; i<=MAXN ; i++)
    pow2[i]=(pow2[i-1]*2)%mod;
    while(t--)
    {
        scanf("%d%d",&n,&k);
        printf("%lld\n",solve(n,k));

    }
}

 

posted @ 2018-09-10 16:58  shuai_hui  阅读(129)  评论(0编辑  收藏  举报