P2768 珍珠项链题解

P2768 珍珠项链

题目背景

小 L 通过泥萌的帮助,成功解决了牛栏的修建问题。奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃。子子孙孙无穷匮也!小 L 于是成为了一代富豪!

但是一直困扰小 L 的就是单身问题!小 L 经过长久的寻觅,小 L 终于找到了一个心仪的漂亮妹子。于是,小 L 打算在 520 那天给妹子一个惊喜!(虽然小 L 很节约,但是对妹子还是很阔绰的!)

题目描述

小 L 决定用 KKK 种珍珠为妹子做一串举世无双的珍珠垂饰。珍珠垂饰是由珍珠连接而成的,其长度可以认为就是珍珠垂饰上珍珠的个数。小 L 现在腰缠万贯,每种珍珠他都拥有 NNN 颗。根据将珍珠垂饰打开后珍珠不同的排列顺序可以区别不同种类的项链。现在,小 L 好奇自己可以组成多少种长度为 111NNN 的不同的珍珠垂饰?当然,为显富有,每串珍珠垂饰都要必须由 KKK 种珍珠连成。 答案取模 123456789112345678911234567891

这一定难不倒聪明的你吧!如果你能帮小 LLL 解决这个问题,也许他会把最后的资产分给你 14\frac{1}{4}41 哦!

输入格式

输入包含多组数据。第一行是一个整数 TTT,表示测试数据的个数。每组数据占一行,包含两个整数 NNNKKK,用一个空格隔开。

输出格式

每组数据输出仅一行,包含一个整数,表示项链的种类数。

输入输出样例 #1

输入 #1

2
2 1
3 2

输出 #1

2
8

说明/提示

对于 40%40\%40% 的数据,满足 1≤N≤1051\leq N\leq 10^51N105, 0≤K≤300\leq K\leq 300K30

对于 100%100\%100% 的数据,满足 T≤10T \leq 10T101≤N≤1091\leq N\leq 10^91N1090≤K≤300\leq K\leq 300K30

对于 70%∼100%70\%\sim100\%70%100% 的数据,时限 101010 ms。

思路

思考一下,DP。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long t,n,k,p[100005],q[100005],f[100005];
const long long mod=1234567891;
long long pow2(long long a1,long long b1){
    long long c1=1;
    while(b1>=1){
        if(b1%2==1){
            c1=c1*a1%mod;
        }
        a1=a1*a1%mod;
        b1/=2;
    }
    return c1;
}
long long C(long long a1,long long b1){
    return p[a1]*q[b1]%mod*q[a1-b1]%mod;
}
int main(){
    cin>>t;
    p[0]=1;
    for(int i=1;i<=100000;i++){
        p[i]=p[i-1]*i%mod;
    }
    for(int i=0;i<=100000;i++){
        q[i]=pow2(p[i],mod-2);
    }
    while(t--){
        cin>>n>>k;
        f[1]=n-k+1;
        for(int i=2;i<=k;i++){
            f[i]=(pow2(i,n+1)-pow2(i,k)+mod)%mod*pow2(i-1,mod-2)%mod;
            for(int j=1;j<=i-1;j++){
                f[i]=(f[i]-f[j]*C(i,j)%mod+mod)%mod;
            }
        }
        cout<<f[k]<<endl;
    }
	return 0;
}
posted @ 2026-01-28 21:20  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源