bzoj4591 【Shoi2015】超能粒子炮·改
由Lucas定理C(n,k)=C(n/2333,k/2333)*C(n%2333,k%2333)%2333
则ans=ΣC(n,i),(i<=k)
=C(n/2333,0)*C(n%2333,0)+C(n/2333,0)*C(n%2333,1)+...+C(n/2333,0)*C(n%2333,2332)
+C(n/2333,1)*C(n%2333,0)+C(n/2333,1)*C(n%2333,1)+...+C(n/2333,1)*C(n%2333,2332)
+.....
+C(n/2333,k/2333)*C(n%2333,0)+....+C(n/2333,k/2333)*C(n%2333,k%2333)
=∑C(n/2333,j)*sum[n%2333][2332]+C(n/2333,k/2333)*sum[n%2333][k%2333],(0<=j<k/2333)
cal(n,k)=cal(n/2333,k/2333-1)*sum[n%2333][2332]+Lucas(n/2333,k/2333)*sum[n%2333][k%2333]
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int p=;
int T,c[p+][p+],sum[p+][p+];
int Lucas(int a,int b)
{
if(a<||b<) return ;
if(a<p&&b<p) return c[a][b];
return Lucas(a/p,b/p)*c[a%p][b%p]%p;
}
int cal(int n,int k)
{
if(k<) return ;
return (cal(n/p,k/p-)*sum[n%p][p-]+Lucas(n/p,k/p)*sum[n%p][k%p])%p;
}
void pre()
{
c[][]=;sum[][]=; for(int i=;i<p;i++) c[i][]=,sum[i][]=,sum[][i]=;
for(int i=;i<p;i++) for(int j=;j<=i;j++) c[i][j]=(c[i-][j-]+c[i-][j])%p;
for(int i=;i<p;i++) for(int j=;j<p;j++) sum[i][j]=sum[i][j-]+c[i][j];
}
signed main()
{
pre();
scanf("%lld",&T);
while(T--)
{
int n,k;
scanf("%lld%lld",&n,&k);
printf("%lld\n",cal(n,k));
}
return ;
}
bzoj4591 【Shoi2015】超能粒子炮·改的更多相关文章
- bzoj4591 [Shoi2015]超能粒子炮·改
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- [bzoj4591][Shoi2015][超能粒子炮·改] (lucas定理+组合计数)
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- BZOJ4591——[Shoi2015]超能粒子炮·改
1.题意:求 2.分析:公式恐惧症的同学不要跑啊QAQ 根据lucas定理-- 这一步大家都能懂吧,这是浅而易见的lucas定理转化过程,将每一项拆分成两项 那么下一步,我们将同类项合并 我们观察可以 ...
- bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...
- bzoj4591 [Shoi2015]超能粒子炮·改——组合数学(+求阶乘逆元新姿势)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 这题不是很裸啊(所以我就不会了) 得稍微推导一下,看这个博客好了:https://bl ...
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...
- bzoj4591 / P4345 [SHOI2015]超能粒子炮·改
P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...
- 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理
4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 95 Solved: 33[Submit][Statu ...
随机推荐
- Android View的几个位置坐标关系
1. View的边界,left, top, right, bottom(即左上右下),这些值都是相对View的父容器说的: 2. View的x, translationX, y, translatio ...
- ios webview自适应实际内容高度4种方法
有的时候会碰见类似的苦逼需求, webview自适应实际内容高度 下面有四种方法供使用 方法1:获取webview中scrovllview的contentsize进行设置 1 2 3 4 5 6 ...
- Android客户端与Eclipse服务器端的Socket通信
Server端代码 用来实现客户端socket的监听 package MyServer; import java.io.BufferedReader; import java.io.BufferedW ...
- C语言关于利用sscanf实现字符串相加减
#include<stdio.h>#include<string.h>void main(){ int a; int b; char str1[10] = "9999 ...
- MVC学习系列3--怎么从控制器向视图传递数据
在MVC中,从控制器到视图,传递数据,可以使用 ViewData 和 ViewBag:同样从视图到控制器,传递数据,可以使用Post,QueryString,或者隐藏域:最后从控制器到控制器,传递数据 ...
- CSS3 box-sizing
请在火狐浏览器测试,其他浏览器不一定有效 <!DOCTYPE html > <html > <head> <meta charset="utf-8& ...
- ORA-14452的出现原因解析及解决方法
在删除临时表时遇到了ORA-14452错误:ORA-14452: attempt to create , alert or drop an index on temporary table alrea ...
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- Perl 脚本报Can't locate Mail/Sender.pm 解决办法
在新的Linux Server(Red Hat Enterprise Linux Server release 5.7 (Tikanga))上配置磁盘空间告警的perl脚本后,测试时报如下错误 ...
- MongoDB学习笔记~官方驱动嵌套数组对象的更新
回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp ...