2018徐州ICPC网络赛A Hard to prepare
组合数学 图的不相邻染色问题
个点
种不同的方案,第1个点有
种方案,2~n-1个点有
种方案,第n个点有
种方案,
但该推导还少了第1个点和第n-1个点相同时第n个点有种方案的情况,
因此,把第1个和第n-1个看作相同,其余n-2个点进行染色,推导方法与上述相同,可产生一个递归方程
前面算的时候n已经算过次了 ,后面递归的是n剩下的额外的
次:
1和n-1合并成同一个,考虑剩下点1~n-2的情况
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
const long long MOD=1e9+7;
long long bit[MAX];
int t,n,K;
void init()
{
bit[0]=1;
for(int i=1;i<MAX;++i) bit[i]=bit[i-1]*2%MOD;
}
long long pow(long long a,int k,long long mod)//快速幂取模
{
long long b=1;
while(k)
{
if(k&1) b=b*a%mod;
a=a*a%mod;
k>>=1;
}
return b;
}
long long get(int n,int K)
{
if(n==2) return bit[K]*(bit[K]-1)%MOD;
if(n==1) return bit[K];
return (bit[K]*pow(bit[K]-1,n-2,MOD)%MOD*(bit[K]-2)%MOD+get(n-2,K))%MOD;
}
int main()
{
init();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&K);
printf("%lld\n",get(n,K));
}
return 0;
}