我们看这段代码

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是质数,所以这里使用了Lucas定理

哦对了还要用乘法逆元的线性求法

下面代码

#include <bits/stdc++.h>
#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见祖宗

最新文章

  1. How repair disk issue when &quot;Fsck Failed please repair manually and reboot&quot;
  2. javascript中parentNode,childNodes,children的应用详解
  3. FW docker使用问题总结,解决国内不能访问gcr.io的问题
  4. Angular学习(1)
  5. yum localinstall rpm
  6. 我的学习笔记之API-Guides翻译------AppComponent_Activites
  7. K2 BPM项目 基于COM组件调用SAP RFC 问题
  8. shell 脚本编程之特殊变量
  9. Struts2学习笔记(五)——Action访问Servlet API
  10. Flask上下文管理源码--亲自解析一下
  11. 20175325 《JAVA程序设计》实验一 《JAVA开发环境的熟悉》实验报告
  12. Scala(一) —— 基础
  13. 【Java每日一题】20170213
  14. influxDB和grafana
  15. SpringMVC教程4
  16. startup.bat闪退问题
  17. Oracle - 层次查询
  18. 如何玩facebook app上的H5游戏
  19. WPF string,color,brush之间的转换
  20. 用js获取客户端IP地址

热门文章

  1. Unity5.X 编辑器介绍
  2. input上传文件获取文件后缀名+select通过text选中option
  3. eclipse集成ijkplayer项目
  4. mount --bind
  5. JAVA面向对象编程深入理解图
  6. 洛谷10月月赛II
  7. STM32 软件复位并模拟USB拔插
  8. 使用uglifyjs压缩JS
  9. JavaScript和CSS实用工具、库与资源
  10. DDL表结构修改