我们发现暴力+裸的卢卡斯可以骗到50分

所以就应该朝卢卡斯的方向去想。

卢卡斯是把n,k拆成两个p进制数进行统计的。

注意到如果在某一位ai>nia_i>n_iai​>ni​,a表示当前的数,n就是给定的n,那么这个数就肯定是0。

所以在p进制时n就是k的限制。

有可以发现这和数位dp很像,所以用数位dp求解就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;const int N = 1e6 + 10;
const int p = 2333;ll n, k;
int c[p][p], a[11], b[11], d[11];void solve() {scanf("%lld%lld", &n, &k);for (int i = 1; i <= 6; i++) {a[i] = int(n % (ll)p);b[i] = int(k % (ll)p);n /= (ll)p, k /= (ll)p;}d[0] = 1;for (int i = 1; i <= 6; i++)d[i] = d[i - 1] * c[a[i]][a[i]] % p;int ans = 0, now = 1;for (int i = 6; i >= 1; i--) {if (b[i] > a[i]) {(ans += now * d[i] % p) %= p;cout << ans << endl;return;}if (b[i] > 0) {(ans += now * c[a[i]][b[i] - 1] % p * d[i - 1] % p) % p;now = now * ((c[a[i]][b[i]] - c[a[i]][b[i] - 1] + p) % p) % p;}}ans = (ans + now) % p;cout << ans << endl;
}int main() {c[0][0] = 1;for (int i = 1; i < p; i++) {c[i][0] = 1;for (int j = 1; j <= i; j++)c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % p;}for (int i = 1; i < p; i++)for (int j = 1; j <= i; j++)c[i][j] = (c[i][j] + c[i][j - 1]) % p;int tt; cin >> tt;while (tt--) solve();return 0;
}

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

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

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

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

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

  3. [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 ...

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

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

  5. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

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

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

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

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

  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. .NET读写Excel工具Spire.Xls使用(1)入门介绍
  2. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
  3. 跟我一步一步开发自己的Openfire插件
  4. 机器学习(七)——规则化和模型选择
  5. js日期比较大小_node.js 内存泄漏的秘密
  6. tar 压缩与解压缩打包命令
  7. Arm发布移动端v9体系新架构,CPU、GPU、IP全囊括了!
  8. [转]游戏UI与flash 组件开发
  9. GARFIELD@11-11-2004
  10. linux udp广播转发到所有ip,linux – 所有接口上的UDP广播
  11. aac,ogg等音频测试文件下载地址
  12. A Busiest Computing Nodes(线段树+优先队列)
  13. C语言编写程序求1到100的和,C语言菜鸟基础教程之求1到100的和
  14. 数字化汗字中仲字如化数字化_如何将旧的电影照片数字化
  15. python Pygame库介绍和使用,基本游戏开发
  16. 2016年云计算会议_云计算会议2012
  17. stm32常用数据类型 U8、U16、U32到底代表什么?
  18. 利用Python的全国旅游景点数据分析案例(新手)
  19. 计算机知识交流的平台,「电脑」-一个分享电脑知识的平台
  20. R语言——相关图的绘制

热门文章

  1. php fopen http 报错,PHP fopen 错误捕获
  2. Eclipse/MyEclipse更新、插件安装及优化
  3. UNIX家族及类UNIX系统
  4. javax.swing设计的系统登录界面
  5. 邮件服务器评分,邮件评分
  6. 根据json文件,可视化LVIS和COCO数据集的GroundTruth标签
  7. 人人学人人【一】 —— 谁人打的太极拳?(转)
  8. java 实现狼吃羊游戏 (一)
  9. BUU LFI COURSE 1
  10. 支架预压弹性变形值计算_支架预压方案介绍 支架预压时间要多久