bzoj4591 [Shoi2015]超能粒子炮·改
2016-05-17 13:23
513 查看
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的值。设S(n,k)=Σ C(n,i) i=0..k
根据lucas定理可以得到
S(n,k) mod p = [ S(n/p,k/p-1)*S(n mod p,p-1)+C(n/p,k/p)*S(n mod p,k mod p) ] mod p
除法均向下取整
预处理0≤n,k<P的C,S值,根据上式递归计算
单次询问时间复杂度为O(log23332n)
#include<cstdio> typedef long long lint; const int P=2333; int c[P][P],s[P][P],t; int C(lint n,lint k){ if(k<0||k>n)return 0; if(n<P)return c [k]; lint a=n/P,b=k/P; return C(a,b)*c[n%P][k%P]%P; } int S(lint n,lint k){ if(k<0)return 0; lint a=n/P,b=k/P; return (S(a,b-1)*s[n%P][P-1]+C(a,b)*s[n%P][k%P])%P; } inline void inc(int&a,int b){ a+=b; if(a>=P)a-=P; } inline lint input(){ lint x=0; int c=getchar(); while(c>57||c<48)c=getchar(); while(c>47&&c<58)x=x*10+c-48,c=getchar(); return x; } int main(){ c[0][0]=1; for(int i=0;i<P-1;i++){ for(int j=0;j<=i;j++){ inc(c[i+1][j],c[i][j]); inc(c[i+1][j+1],c[i][j]); } } for(int i=0;i<P;i++){ s[i][0]=c[i][0]; for(int j=1;j<P;j++)inc(s[i][j]=s[i][j-1],c[i][j]); } t=input(); while(t--){ lint a=input(),b=input(); printf("%d\n",S(a,b)); } return 0; }
相关文章推荐
- Android环境搭建
- POJ 2104 K-th Number 划分树
- 互联网秒杀业务架构设计 / 秒杀系统架构分析与实战
- C#与C++(结构体内对象指定大小)
- ios app打ipa包
- 详解Office 外接程序 COM Add In的LoadBehavior及其妙用
- LoadRunner下设置监控Windows系统资源
- Unity AssetDatabase和Resources资源管理
- iOS --统一导航栏“返回”键,并当push隐藏控制器底部tabBar
- 中文编译提示 Code::Blocks SVN6988学习增强版(适合C/C++初学者)
- KMP算法与next数组的代码初步实现
- 【HYSBZ1588: [HNOI2002]】营业额统计——伸展树
- 深入JDK源码_Index --> 深入JDK源码之ThreadLocal类 --> 陶邦仁 又发现一牛人
- z-index的有关注意事项
- IntelliJ IDEA 显示行号和设置字体大小的方法
- Asp.Net Mvc 使用WebUploader 多图片上传
- Ehcache详细解读
- 利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
- 解决LINUX 双网卡无法上网问题小记
- 谷歌地图要发力:研发室内3D地图 提供虚拟现实体验