zoukankan      html  css  js  c++  java
  • BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理

    BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理

    Description

    曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加
    强大的粒子流的神秘装置。超能粒子炮·改相比超能粒子炮,在威力上有了本质的提升。它有三个参数n,k。它会
    向编号为0到k的位置发射威力为C(n,k) mod 2333的粒子流。现在SHTSC给出了他的超能粒子炮·改的参数,让你求
    其发射的粒子流的威力之和模2333。

    Input

    第一行一个整数t。表示数据组数。
    之后t行,每行二个整数n,k。含义如题面描述。
    k<=n<=10^18,t<=10^5

    Output

    t行每行一个整数,表示其粒子流的威力之和模2333的值。

    Sample Input

    1
    5 5

    Sample Output

    32

     
    $f(n,k)=sumlimits_{i=0}^{k}C(n,i)$

    $=sumlimits_{i=0}^{k} C(n$%$p,i$%$p) imes C(n/p,i/p)$

    设$a=lfloor k/p floor ,b=k$%$p$

    $=sumlimits_{i=0}^{ap-1}C(n$%$p,i$%$p) imes C(n/p,i/p)+sumlimits_{i=ap}^{ap+b}C(n$%$p,i$%$p) imes C(n/p,i/p)$

    $=sumlimits_{i=0}^{p-1}C(n$%$p,i) imes sumlimits_{i=0}^{a-1}C(n/p,i)+C(n/p,a) imes sumlimits_{i=0}^{b}C(n$%$p,b)$

    $=f(n$%$p,p-1)* f(n/p,a-1)+C(n/p,a)* f(n$%$p,b)$
    递归求解即可。
     
    代码:
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 2550
    typedef long long ll;
    const int mod=2333;
    int c[N][N],f[N][N];
    void init() {
        int i,j;
        for(i=0;i<=mod;i++) c[i][0]=f[i][0]=1;
        for(i=0;i<=mod;i++) {
            for(j=1;j<=i;j++) {
                c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
                f[i][j]=(f[i][j-1]+c[i][j])%mod;
            }
            for(j=i+1;j<=mod;j++) f[i][j]=f[i][j-1];
        }
    }
    int Lucas(ll n,ll m) {
        if(n<m) return 0;
        if(n<mod&&m<mod) return c[n][m];
        return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod;
    }
    int solve(ll n,ll k) {
        ll a=k/mod;int b=k%mod;
        if(k<mod) return f[n%mod][k];
        return (solve(n%mod,mod-1)*solve(n/mod,a-1)%mod+Lucas(n/mod,a)*solve(n%mod,b)%mod)%mod;
    }
    int main() {
        init();
        int T;
        scanf("%d",&T);
        ll n,k;
        while(T--) {
            scanf("%lld%lld",&n,&k);
            printf("%d
    ",solve(n,k));
        }
    }
    
     
  • 相关阅读:
    构造方法中使用this的含义
    Android Bundle类
    Android中使用PULL方式解析XML文件
    Android 创建与解析XML(四)—— Pull方式
    File的getPath()和getAbsolutePath()和getCanonicalPath()的区别
    Android-取出SDcard卡下指定后缀名的文件
    page、request、session和application有什么区别?
    prepareStatement的用法和解释
    pageContext对象的用法
    使用JSP连接MySql数据库读取HTML表单数据进行存贮
  • 原文地址:https://www.cnblogs.com/suika/p/9186369.html
Copyright © 2011-2022 走看看