zoukankan      html  css  js  c++  java
  • 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('
    '); }
    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 }

  • 相关阅读:
    正则表达式30分钟入门教程
    oracle常用的字符和字符串处理类函数
    [转载]C#实现软件自动更新思路
    ORACLE函数介绍
    xml 文件操作类
    oracle 主键生成策略
    wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
    NSIS开始...
    Oracle分析函数详述
    常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/e-e-thinker/p/13347653.html
Copyright © 2011-2022 走看看