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 }

 

posted @ 2020-07-20 20:53  e_e_thinker  阅读(187)  评论(0编辑  收藏  举报