zoukankan      html  css  js  c++  java
  • 一本通1658超能粒子炮 · 改

    1658:超能粒子炮 · 改

    时间限制: 1000 ms         内存限制: 524288 KB

    【题目描述】

    曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改——一种可以发射威力更加强大的粒子流的神秘装置。

    超能粒子炮・改相比超能粒子炮,在威力上有了本质的提升。它有两个参数 n、k,它会向每个编号为 0 到 k(包含两端)的位置 ii 发射威力为Cinmod2333 的粒子流。

    现在 SHTSC 给出了他的超能粒子炮・改的参数,让你求出其发射的粒子流的威力之和除以 2333 所得的余数。

    【输入】

    第一行一个整数 t 表示数据组数。

    之后 t 行,每行两个整数 n、k,含义如题面描述。

    【输出】

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

    【输入样例】

    3
    5 5
    10 7
    1145 14

    【输出样例】

    32
    968
    763

    【提示】

    sol:想了一会以后感觉非常不可做,于是翻题解去了。。

    一起膜拜这位大佬。。。

    掏出他的过程

    p=2333a=k/pb=k mod p,那么有:

    Ps:最后一行第一个f(n/p,k/p)应该改为f(n/p,k/p-1)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    const ll Mod=2333;
    const int N=2400;
    int T;
    ll C[N][N],F[N][N];
    inline ll Lucas(ll n,ll m)
    {
        if(n<m) return 0;
        if(n<Mod) return C[n][m];
        return Lucas(n%Mod,m%Mod)*Lucas(n/Mod,m/Mod)%Mod;
    }
    inline ll Calc(ll n,ll k)
    {
        if(k<Mod) return F[n%Mod][k];
        return (F[n%Mod][Mod-1]*Calc(n/Mod,k/Mod-1)+Lucas(n/Mod,k/Mod)*Calc(n%Mod,k%Mod))%Mod;
    }
    int main()
    {
        R(T);
        ll i,j,n,k;
        for(i=0;i<=Mod;i++)
        {
            C[i][0]=F[i][0]=1;
            for(j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%Mod;
            for(j=1;j<=Mod;j++) F[i][j]=(F[i][j-1]+C[i][j])%Mod;
        }
        while(T--)
        {
            n=read(); k=read();
            Wl(Calc(n,k));
        }
        return 0;
    }
    /*
    input
    4
    5 5
    10 7
    1145 14
    2333233323332333 2333
    output
    32
    968
    763
    845
    */
    View Code
  • 相关阅读:
    CF960G-Bandit Blues【第一类斯特林数,分治,NTT】
    P6122-[NEERC2016]Mole Tunnels【模拟费用流】
    P5404-[CTS2019]重复【KMP,dp】
    P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
    T183637-变异距离(2021 CoE III C)【单调栈】
    61-A
    2021-4-1考试
    JAVA日常练习—程序输入string转化为int并求和
    并发编程
    git clone 报filename too long 错误的解决方法
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10546661.html
Copyright © 2011-2022 走看看