题目描述

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

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

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

输入格式

第一行一个整数 ttt 表示数据组数。
之后 ttt 行,每行两个整数 nnn、kkk,含义如题面描述。

输出格式

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

样例

样例输入

3
5 5
10 7
1145 14

样例输出

32
968
763

数据范围与提示

对于 10%10\%10% 的数据,t=1t = 1t=1,n,k≤1000n, k \leq 1000n,k1000;
对于 30%30\%30% 的数据,t=1t = 1t=1,n,k≤1000000n, k \leq 1000000n,k1000000;
对于 50%50\%50% 的数据,t=1t = 1t=1,n≤1018,k≤1000n \leq 10^{18}, k \leq 1000n1018​​,k1000;
对于 70%70\%70% 的数据,t=100t = 100t=100,n,k≤1018n, k \leq 10^{18}n,k1018​​;
对于 100%100\%100% 的数据,t=100000t = 100000t=100000,n,k≤1018n, k \leq 10^{18}n,k1018​​。

 loj #2038. 「SHOI2015」超能粒子炮・改

 

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 2333
#define maxn 3010
using namespace std;
int T,fac[maxn],inv[maxn];
long long n,k;
int Pow(int x,int y){
    int res=1;
    while(y){
        if(y&1)res=1LL*res*x%mod;
        x=1LL*x*x%mod;
        y>>=1;
    }
    return res;
}
long long C(long long n,long long m){
    if(m>n)return 0;
    return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long Lucas(long long n,long long m){
    if(m==0)return 1;
    return 1LL*C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}
int main(){
    scanf("%d",&T);
    fac[0]=inv[0]=1;
    for(int i=1;i<=3000;i++){
        fac[i]=1LL*fac[i-1]*i%mod;
        inv[i]=Pow(fac[i],mod-2);
    }
    int ans;
    while(T--){
        ans=0;
        cin>>n>>k;
        for(int i=0;i<=k;i++){
            ans+=Lucas(n,i);
            if(ans>=mod)ans-=mod;
        }
        printf("%d\n",ans);
    }
    return 0;
}
50分 Lucas定理

相关文章:

  • 2021-09-21
  • 2022-01-22
  • 2021-10-09
  • 2022-12-23
  • 2021-09-14
  • 2021-12-06
  • 2022-01-11
猜你喜欢
  • 2022-01-25
  • 2021-07-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案