一本通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=2333, a=k/p, b=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 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!