博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P5160 WD与循环
阅读量:4361 次
发布时间:2019-06-07

本文共 1543 字,大约阅读时间需要 5 分钟。

我们看这段代码

int cnt = 0;for (int a_1 = 0; a_1 <= m; a_1++) {    for (int a_2 = 0; a_1 + a_2 <= m; a_2++) {    ...        for (int a_n = 0; a_1 + a_2 + ... + a_n <= m; a_n++) {            cnt = (cnt + 1) % 19491001;        }    }}printf("%d\n", cnt);

其实是可以改写为

int cnt = 0;for (int a_1 = 1; a_1 <= m + n; a_1++) {    for (int a_2 = 1; a_1 + a_2 <= m + n; a_2++) {    ...        for (int a_n = 1; a_1 + a_2 + ... + a_n <= m + n; a_n++) {            cnt = (cnt + 1) % 19491001;        }    }}printf("%d\n", cnt);

答案不变(就是把\(a_0, a_1, ... , a_n\)全部加了1,源代码里相应的\(m\)要增加\(n\),因为n个循环变量,每个变量都增加了1,所需增加即为\(n \times 1 = n\)

然后根据组合数学中组合数的定义,所求为C(m + n, n)

由于数特~别~大~,而且19491001是质数,所以这里使用了

哦对了还要用

下面代码

#include 
#define int long long#pragma GCC optimize(3)#pragma GCC optimize("Ofast")using namespace std;const int maxn = 20000000;const int p = 19491001LL;int n, inv[maxn], m, js[maxn];int Lucas(int n, int m){ if(n < m)return 0LL; if(n < p)return js[n] * inv[m] % p * inv[n - m] % p; return Lucas(n % p, m % p) * Lucas(n / p, m / p) % p;}signed main(){ int t; scanf("%lld", &t); js[0] = 1LL; for(register int i = 1LL; i <= p; i++)js[i] = js[i - 1] * i % p; inv[1] = 1LL; inv[0] = 1LL; for(register int i = 2LL; i <= p; i++)inv[i] = (p - p / i) * inv[p % i] % p; for(register int i = 2LL; i <= p; i++)inv[i] = inv[i] * inv[i - 1] % p; while(t--) { scanf("%lld%lld", &n, &m); printf("%lld\n", Lucas(n + m, m)); } return 0;}

三年OI一场空,不开long long见祖宗

转载于:https://www.cnblogs.com/iycc/p/10216975.html

你可能感兴趣的文章
String、StringBuffer与StringBuilder之间区别
查看>>
Timer.3 - Binding arguments to a handler
查看>>
linux 判断变量是否相等方法
查看>>
只能为浮点数的正则表达式
查看>>
Android之指南针学习 分类: Android开发 ...
查看>>
android学习和广告平台赚钱zz 分类: Android其他 ...
查看>>
第7章例7-13
查看>>
推荐几本产品类的书
查看>>
VC++一些开发心得与调试技巧
查看>>
python 归纳 (二八)_python测试使用快速上手
查看>>
oracle 11g虚拟机安装环境配置脚本
查看>>
高并发的初识和想法
查看>>
[HihoCoder-1424] Asa's Chess Problem
查看>>
事件委托
查看>>
利用for循环找出1000以内的质数
查看>>
使用jQuery快速高效制作网页交互特效(5)
查看>>
C++学习(十一)(C语言部分)之 练习
查看>>
JMS【三】--ActiveMQ简单的HelloWorld实例
查看>>
visual c++基础(windows窗口程序解析)
查看>>
【趣味】0基础快速掌握区块链服务关键概念
查看>>