注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积。对于k的限制容易想到数位dp。可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡限制的贡献就很好dp了。为什么大家都要化式子呢。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define P 2333
ll read()
{ll x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int T,C[P][P],S[P][P],a[20],b[20],f[20][2];
ll n,m;
int calc(ll n,ll m)
{int t=-1;while (n) a[++t]=n%P,n/=P;for (int i=0;i<=t;i++) b[i]=m%P,m/=P;memset(f,0,sizeof(f));f[t+1][1]=1;for (int i=t;~i;i--){f[i][1]=f[i+1][1]*C[a[i]][b[i]]%P;if (b[i]) f[i][0]=f[i+1][1]*S[a[i]][b[i]-1]%P;f[i][0]=(f[i][0]+f[i+1][0]*S[a[i]][P-1]%P)%P;}return (f[0][0]+f[0][1])%P;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4591.in","r",stdin);freopen("bzoj4591.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifT=read();for (int i=0;i<P;i++){C[i][0]=C[i][i]=1;for (int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;S[i][0]=1;for (int j=1;j<P;j++) S[i][j]=(S[i][j-1]+C[i][j])%P;}while (T--){n=read(),m=min(n,read());printf("%d\n",calc(n,m));}return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9899949.html

BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)相关推荐

  1. [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)

    大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...

  2. [2019.2.24]BZOJ4591 [Shoi2015]超能粒子炮·改

    以下除法一律为整除. 求\(\sum_{i=0}^kC_n^i\ mod\ p,p=2333\) 设\(f(i,j)=\sum_{k=0}^jC_i^k\) \(f(n,k)=\sum_{i=0}^k ...

  3. 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)

    [BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...

  4. P4345 [SHOI2015]超能粒子炮·改

    P4345 [SHOI2015]超能粒子炮·改 题意: 求解式子∑i=0kCni%p\sum_{i=0}^{k}C_{n}^{i} \% p∑i=0k​Cni​%p n,k<=1e18 题解: ...

  5. [SHOI2015] 超能粒子炮·改

    题目链接:戳我 设\(f[n][k]=\sum_{i=0}^kC_n^i\pmod {2333}\) 那么根据卢卡斯定理我们知道\(f[n][k]=\sum_{i=0}^kC_{n/p}^{i/p}\ ...

  6. 【[SHOI2015]超能粒子炮·改】

    就是运用\(Lucas\)推一个柿子 首先是前置芝士\(Lucas\)定理 \[C_{n}^{m}\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p\] 至于证明 我建议去问一下 ...

  7. loj2038「SHOI2015」超能粒子炮・改(卢卡斯的理解和延伸+数位dp)

    我们发现暴力+裸的卢卡斯可以骗到50分 所以就应该朝卢卡斯的方向去想. 卢卡斯是把n,k拆成两个p进制数进行统计的. 注意到如果在某一位ai>nia_i>n_iai​>ni​,a表示 ...

  8. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问,给出n,kn,kn,k求 ∑i=0k(ni)\sum_{i=0}^{k}\bino ...

  9. 超能粒子炮·改 HYSBZ - 4591

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4591 就是求:                    C(n,0)+C(n,1)+... ...

最新文章

  1. linux 编译opencl,OpenCL编译环境配置(VS+Nvidia)
  2. 亿级流量场景下如何为HTTP接口限流?看完我懂了!!
  3. 列了一些自己会但是不怎么精通的编程语言和知识,做个记录,空余时间加强学习...
  4. SSM整合(2): spring 与 mybatis 整合
  5. js中的局部变量和全局变量
  6. 自己整理的openresty安装步骤
  7. Unity3D 场景与C# Control进行结合
  8. Go语言语法学习:打印九九乘法表
  9. js mysql json字符串转数组中_php数据库数据转换为js中的json对象
  10. 信息学奥赛一本通(1152:最大数max(x,y,z))
  11. Java线程局部变量ThreadLocal
  12. React列表中实现文案多行收起展开的功能
  13. apache ii评分怎么评_APACHE-II评分表.doc
  14. 神朔 计算机联锁,计算机联锁系统集中操控方式在宁东铁路中的应用
  15. google搜索插件
  16. 微信扫一扫下载apk的实现方式 微信跳转浏览器代码
  17. Pranava Pra 使用教程
  18. 对话框不响应WM_KEYDOWN消息,可以通过重载BOOL PreTranslateMessage(MSG * pMsg)来实现
  19. Flutter中的圆角和圆形效果
  20. 关闭删库跑路的后门,打造高可用的MySQL

热门文章

  1. HttpModule,HttpHandler 简介
  2. 漫步微积分三十——定积分的性质
  3. php header函数的详解,php header函数的详解_PHP教程
  4. java http请求实现_JAVA实现HTTP请求方式
  5. python比较两个文件内容是否相同_python比较两个列表是否相等的方法
  6. python 3.5安装pywin32
  7. access vba在新建查询前查看查询名是否存在
  8. OpenCV--卡尔曼滤波(KalmanFilter)详解【转载】
  9. 单目相机提高标定精度的经验(转载)
  10. CentOs基础操作指令(时间日期、搜索查找)