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