博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
loj #2038. 「SHOI2015」超能粒子炮・改
阅读量:4562 次
发布时间:2019-06-08

本文共 2529 字,大约阅读时间需要 8 分钟。

 

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

 

题目描述

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

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

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

输入格式

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

之后 ttt 行,每行两个整数 nnn、kkk,含义如题面描述。

输出格式

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

样例

样例输入

35 510 71145 14

样例输出

32968763

数据范围与提示

对于 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​​。

 

 

#include
#include
#include
#define mod 2333#define maxn 3010using 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定理
#include
#include
#include
using namespace std;const int mod=2333;long long sum[2335][2335];long long Pow(long long x,long long k){ int res=1; while(k){ if(k&1)res=res*x%mod; x=x*x%mod; k>>=1; } return res;}long long fact[mod+10],inv[mod+10];void init(){ fact[0]=1; inv[0]=1; for(int i=1;i<=mod;i++){ fact[i]=fact[i-1]*i%mod; inv[i]=Pow(fact[i],mod-2); }}long long Lucas(long long n,long long m){ long long a,b,res=1LL; while(n&&m){ a=n%mod,b=m%mod; if(a
=mod) ans+=cal(n/mod,k/mod-1)*sum[n%mod][mod-1]%mod; ans%=mod; return ans;}int main(){ int T; init(); for(int i=0;i
100分 Lucas定理+式子推导

 

转载于:https://www.cnblogs.com/thmyl/p/8854073.html

你可能感兴趣的文章
拨号进入防盗界面
查看>>
makefile学习经验(二)----编译生成静态库文件
查看>>
python装饰器
查看>>
HDUOJ---2082
查看>>
【2018.2.8-】网络流学习笔记(含ISAP!)
查看>>
【2019.3.2】NOI 模拟赛
查看>>
设计模式(3)----工厂方法模式
查看>>
Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
查看>>
Caused by: java.lang.ClassNotFoundException: HttpServletRequest
查看>>
C++primer plus第十章第5题
查看>>
SqlServer 之 查看表空间
查看>>
Python学习笔记(matplotlib篇)--使用matplotlib绘制直方图
查看>>
salesforce 零基础学习(二十一)workflow Q&A
查看>>
Leetcode 120: Triangle
查看>>
ACM模板——二分图
查看>>
【Java初探02】——Java语言基础
查看>>
leetcode 48. Rotate Image
查看>>
Windows 7下java SDK下载、安装及环境变量设置
查看>>
java 自定义序列化
查看>>
把Windows7启动栏上的库修改为我的电脑
查看>>