P2768 珍珠项链题解
P2768 珍珠项链
题目背景
小 L 通过泥萌的帮助,成功解决了牛栏的修建问题。奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃。子子孙孙无穷匮也!小 L 于是成为了一代富豪!
但是一直困扰小 L 的就是单身问题!小 L 经过长久的寻觅,小 L 终于找到了一个心仪的漂亮妹子。于是,小 L 打算在 520 那天给妹子一个惊喜!(虽然小 L 很节约,但是对妹子还是很阔绰的!)
题目描述
小 L 决定用 KKK 种珍珠为妹子做一串举世无双的珍珠垂饰。珍珠垂饰是由珍珠连接而成的,其长度可以认为就是珍珠垂饰上珍珠的个数。小 L 现在腰缠万贯,每种珍珠他都拥有 NNN 颗。根据将珍珠垂饰打开后珍珠不同的排列顺序可以区别不同种类的项链。现在,小 L 好奇自己可以组成多少种长度为 111 至 NNN 的不同的珍珠垂饰?当然,为显富有,每串珍珠垂饰都要必须由 KKK 种珍珠连成。 答案取模 123456789112345678911234567891。
这一定难不倒聪明的你吧!如果你能帮小 LLL 解决这个问题,也许他会把最后的资产分给你 14\frac{1}{4}41 哦!
输入格式
输入包含多组数据。第一行是一个整数 TTT,表示测试数据的个数。每组数据占一行,包含两个整数 NNN 和 KKK,用一个空格隔开。
输出格式
每组数据输出仅一行,包含一个整数,表示项链的种类数。
输入输出样例 #1
输入 #1
2
2 1
3 2
输出 #1
2
8
说明/提示
对于 40%40\%40% 的数据,满足 1≤N≤1051\leq N\leq 10^51≤N≤105, 0≤K≤300\leq K\leq 300≤K≤30。
对于 100%100\%100% 的数据,满足 T≤10T \leq 10T≤10,1≤N≤1091\leq N\leq 10^91≤N≤109,0≤K≤300\leq K\leq 300≤K≤30。
对于 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;
}

浙公网安备 33010602011771号