一本通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('\n')
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

 

posted @ 2019-03-17 13:24  yccdu  阅读(756)  评论(0编辑  收藏  举报