2018徐州ICPC网络赛A Hard to prepare 组合数- 环的不相邻染色

2018徐州ICPC网络赛A Hard to prepare

组合数学 图的不相邻染色问题

n个点bit[k]种不同的方案,第1个点有bit[k]种方案,2~n-1个点有bit[k]-1种方案,第n个点有bit[k]-2种方案,

但该推导还少了第1个点和第n-1个点相同时第n个点有get(n-2,k)种方案的情况,

因此,把第1个和第n-1个看作相同,其余n-2个点进行染色,推导方法与上述相同,可产生一个递归方程

前面算的时候n已经算过bit[k]-2次了 ,后面递归的是n剩下的额外的get(n-2,k) 次:

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

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值