20200720T2 昂贵的珍珠垂饰(洛谷P2768珍珠项链)
Description
情人节之际,Alex决定用K种珍珠为他的GF做一串举世无双的珍珠垂饰与她的项链相配。珍珠垂饰是由珍珠连接而成的,其长度可以认为就是珍珠垂饰上珍珠的个数。众所周知,Alex家缠万贯,每种珍珠他都拥有N颗。根据将珍珠垂饰打开后珍珠不同的排列顺序可以区别不同种类的项链。现在,他好奇自己可以组成多少种长度为1至N的不同的珍珠垂饰?当然,为显富有,每串珍珠垂饰都要必须由K种珍珠连成。
答案取模1234567891。
Input
输入包含多组数据。第一行是一个整数T,表示测试数据的个数。每组数据占一行,包含两个整数N和K,用一个空格隔开。
[Technical Specification]
1 <= T <= 10
1 <= N <= 1,000,000,000
1 <= K <= 30
Output
每组数据输出仅一行,为项链的种类数。
Sample Input
2 2 1 3 2
Sample Output
2 8
Solution
如果没有限制的话一共该是种
容斥一下即得ans为
再把后面那个式子用等比数列优化一下就好
注意负数。。。因为这个WA了好多次
code
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<queue> 7 #include<vector> 8 #include<stack> 9 #include<set> 10 #include<deque> 11 #include<map> 12 using namespace std; 13 14 template <typename T> void read(T &x) { 15 x = 0; int f = 1; char c; 16 for (c = getchar(); c < '0' || c > '9'; c = getchar()) if (c == '-') f = -f; 17 for (; c >= '0' && c <= '9'; c = getchar()) x = 10 * x + c - '0' ; 18 x *= f; 19 } 20 template <typename T> void write(T x){ 21 if (x < 0) putchar('-'), x = -x; 22 if (x > 9) write(x / 10); 23 putchar(x % 10 + '0'); 24 } 25 template <typename T> void writeln(T x) { write(x); putchar('\n'); } 26 template <typename T> void writesn(T x) { write(x); putchar(' '); } 27 28 #define int long long 29 #define inf 1234567890 30 #define next net 31 #define P 1234567891 32 #define N 500020 33 #define mid ((l+r)>>1) 34 #define lson (o<<1) 35 #define rson (o<<1|1) 36 #define R register 37 38 int t,n,k,kkk,ans; 39 int jc[35]; 40 int ksm(int a,int b){ 41 int res=1; 42 while(b){ 43 if(b&1)res=res*a%P; 44 a=a*a%P; 45 b>>=1; 46 } 47 return res; 48 } 49 int C(int x,int y){ 50 return jc[x]*ksm(jc[y]*jc[x-y]%P,P-2)%P; 51 } 52 int calc(int x){ 53 if(x==1)return n; 54 return (ksm(x,n+1)-x+P)%P*ksm(x-1,P-2)%P; 55 } 56 signed main(){ 57 jc[0]=1; 58 for(R int i=1;i<=30;i++)jc[i]=jc[i-1]*i%P; 59 read(t); 60 while(t--){ 61 ans=0;kkk=-1; 62 read(n);read(k); 63 for(R int i=0;i<=k;i++){ 64 kkk=-kkk; 65 ans=((ans+kkk*C(k,i)*calc(k-i)%P)%P+P)%P; 66 } 67 writeln(ans); 68 } 69 return 0; 70 }