快速幂+递归

https://ac.nowcoder.com/acm/problem/14584
f(n,k) 表示 n 个气球涂 k 种颜色的方案数,则


(不考虑1号与n号气球颜色是否相同的方案数 - 1号与n号气球颜色相同的方案数)

且:

#include <iostream>
#define LL long long
using namespace std;
const int maxn = 1e5+5;
const int M = 1e8+7;
LL mp(LL x,LL y,LL _M){
    LL ret = 1ll;
    for(;y;y>>=1,x=(LL)x*x%_M)
    if(y&1) ret=(LL)ret*x%_M;
    return ret%_M;
}
LL sol(LL n,LL k){
    if(n==2) return (LL)k*(k-1)%M;
    return ((LL)k*mp(k-1,n-1,M)%M-sol(n-1,k)+M)%M;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    LL n,k,T;
    cin>>T;
    while(T--){
        cin>>n>>k;
        cout<<sol(n,k)<<"\n";
    }
    return 0;
}
全部评论

相关推荐

评论
1
1
分享
牛客网
牛客企业服务