loj2038「SHOI2015」超能粒子炮・改(卢卡斯的理解和延伸+数位dp)
我们发现暴力+裸的卢卡斯可以骗到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)相关推荐
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...
- P4345 [SHOI2015]超能粒子炮·改
P4345 [SHOI2015]超能粒子炮·改 题意: 求解式子∑i=0kCni%p\sum_{i=0}^{k}C_{n}^{i} \% p∑i=0kCni%p n,k<=1e18 题解: ...
- [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 ...
- 【[SHOI2015]超能粒子炮·改】
就是运用\(Lucas\)推一个柿子 首先是前置芝士\(Lucas\)定理 \[C_{n}^{m}\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p\] 至于证明 我建议去问一下 ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- [SHOI2015] 超能粒子炮·改
题目链接:戳我 设\(f[n][k]=\sum_{i=0}^kC_n^i\pmod {2333}\) 那么根据卢卡斯定理我们知道\(f[n][k]=\sum_{i=0}^kC_{n/p}^{i/p}\ ...
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问,给出n,kn,kn,k求 ∑i=0k(ni)\sum_{i=0}^{k}\bino ...
- 超能粒子炮·改 HYSBZ - 4591
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4591 就是求: C(n,0)+C(n,1)+... ...
最新文章
- .NET读写Excel工具Spire.Xls使用(1)入门介绍
- 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
- 跟我一步一步开发自己的Openfire插件
- 机器学习(七)——规则化和模型选择
- js日期比较大小_node.js 内存泄漏的秘密
- tar 压缩与解压缩打包命令
- Arm发布移动端v9体系新架构,CPU、GPU、IP全囊括了!
- [转]游戏UI与flash 组件开发
- GARFIELD@11-11-2004
- linux udp广播转发到所有ip,linux – 所有接口上的UDP广播
- aac,ogg等音频测试文件下载地址
- A Busiest Computing Nodes(线段树+优先队列)
- C语言编写程序求1到100的和,C语言菜鸟基础教程之求1到100的和
- 数字化汗字中仲字如化数字化_如何将旧的电影照片数字化
- python Pygame库介绍和使用,基本游戏开发
- 2016年云计算会议_云计算会议2012
- stm32常用数据类型 U8、U16、U32到底代表什么?
- 利用Python的全国旅游景点数据分析案例(新手)
- 计算机知识交流的平台,「电脑」-一个分享电脑知识的平台
- R语言——相关图的绘制