1. 程式人生 > >BZOj-4591: [Shoi2015]超能粒子炮·改 (Lucas+排列組合)

BZOj-4591: [Shoi2015]超能粒子炮·改 (Lucas+排列組合)

return its inline -s desc bsp super discus esc

4591: [Shoi2015]超能粒子炮·改

Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 960 Solved: 360
[Submit][Status][Discuss]

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

HINT

Source

By 佚名上傳

不說話qwq laj只是練練Lucas
 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int
mod=2333; 5 LL c[mod][mod],s[mod][mod]; 6 inline LL read(){ 7 LL an=0,x=1;char c=getchar(); 8 while (c<0 || c>9) {if (c==-) x=-1;c=getchar();} 9 while (c>=0 && c<=9) {an=(an<<3)+(an<<1)+c-0;c=getchar();} 10 return an*x; 11 } 12 LL Lucas(LL n,LL m){
13 if (n<m) return 0; 14 if (n<mod && m<mod) return c[n][m]; 15 return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod; 16 } 17 LL cal(LL n,LL k) 18 { 19 if (k<0) return 0; 20 return (cal(n/mod,k/mod-1)*s[n%mod][mod-1]+Lucas(n/mod,k/mod)*s[n%mod][k%mod])%mod; 21 } 22 int main(){ 23 freopen ("super.in","r",stdin);freopen ("super.out","w",stdout); 24 int i,j;c[0][0]=s[0][0]=1; 25 for (i=1;i<mod;i++) s[0][i]=1; 26 for (i=1;i<mod;i++){ 27 c[i][0]=1,c[i][1]=i,c[i][i]=1;s[i][0]=1,s[i][1]=i+1; 28 for (j=2;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 29 for (j=1;j<mod;j++) s[i][j]=(s[i][j-1]+c[i][j])%mod; 30 } 31 LL t,n,k; 32 t=read(); 33 while (t--){ 34 n=read(),k=read(); 35 printf("%lld\n",cal(n,k)); 36 } 37 return 0; 38 }

BZOj-4591: [Shoi2015]超能粒子炮·改 (Lucas+排列組合)