#422 Div2 D

题意

假设有 n 个人比赛,每次比赛进行分组,每组人数必须相同,如果一组有 x 人,则那一组要比赛 $ \frac{x * (x - 1)}{2}$次,最终一人获胜,其它人淘汰,不同回合的 x 可以不同,设最终经过 f(n) 次比赛比赛结束(产生冠军)。给出 t, l, r 求 \(t^0*f(l)+t^1*f(l+1)+...+t^{r-l}*f(r)\)。

分析

通过测试几组数据可以发现,分的组越多,总比赛次数越少,那么就要 x 尽可能的小,所以对于参赛的 n 个人, n 的最小质因子 k 为每组的人数,如果 n 为素数,\(f(n)=\frac{n * (n - 1)} 2\),否则 \(f(n)=f(\frac n k)+\frac n k * f(k)\),。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 5e6 + 5;
const int INF = 2e9 + 1;
const ll MOD = 1e9 + 7;
ll dp[MAXN];
int is_prime[MAXN];
vector<int> prime;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for(int i = 2; i < MAXN; i++) {
if(!is_prime[i]) {
prime.push_back(i);
for(ll j = 1LL * i * i; j < MAXN; j += i) {
is_prime[j] = 1;
}
}
}
ll t;
int l, r;
cin >> t >> l >> r;
for(int i = 2; i <= r; i++) {
if(!is_prime[i]) {
dp[i] = 1LL * i * (i - 1) / 2 % MOD;
} else {
for(auto j : prime) {
if(i % j == 0) {
dp[i] = (dp[i / j] + 1LL * i / j * dp[j]) % MOD;
break;
}
}
}
}
ll x = 1, ans = 0;
for(int i = l; i <= r; i++) {
ans = (ans + x * dp[i]) % MOD;
x = (x * t) % MOD;
}
cout << ans << endl;
return 0;
}

最新文章

  1. .net动态类型在处理json数据方面的应用
  2. Android WebView useragent
  3. iOS开发——高级技术&amp;通讯录服务
  4. 使用Proj.Net创建空间参考
  5. 【POJ3243】拓展BSGS(附hash版)
  6. 【程序员的SQL金典】笔记(第6章~第11章)
  7. [itint5]交替字符串
  8. editpuls查找替换通配符
  9. 开发一个完整的JavaScript组件
  10. java-下载excel
  11. Copy an serializable object deeply
  12. python的__init__几种方法总结
  13. TP3.2 图片上传及缩略图
  14. 安装adb之后出现 找不到设备的情况
  15. [已解决]pip安装包时报错:Read time out
  16. 项目Alpha冲刺Day2
  17. Go:学习笔记兼吐槽(3)
  18. Currency Exchange POJ - 1860 (spfa判断正环)
  19. 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
  20. SQL语句 拆分某些字段,一行变多行

热门文章

  1. Vbs 测试程序一
  2. mongodb安装和配置三步走
  3. 每天一个Linux命令(10):mv命令
  4. 孤荷凌寒自学python第二十一天初识python的类
  5. HDU 4763 Theme Section ( KMP next函数应用 )
  6. VS调试时不捕捉Exception
  7. python3.6操作mysql
  8. c# json 反序列化 泛型List 2行代码
  9. 【Luogu】P2498拯救小云公主(spfa)
  10. 纪中集训总结 &amp;&amp; 新学期目标