码迷,mamicode.com
首页 > 其他好文 > 详细

cf822D(质因子)

时间:2017-07-04 18:12:59      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:gif   因子   clu   str   open   cin   lan   index   main   

题目链接: http://codeforces.com/problemset/problem/822/D

 

题意: 输入 t, l, r 求 t0·f(l)?+?t1·f(l?+?1)?+?...?+?tr?-?l·f(r) % (1e9 + 7) , 至于 f(n) 是多少还是直接去看题目描述吧, 好难说清楚;

 

思路: xjb

很显然将 n 分解成质因子积的形式时比的场数最少, 那么可以用prime[i] 存储 i 的最小素数因子, 然后 n 不断除 prime[n] 即可得到 n 的质因子积的形式;

剩下的按照公式来就好了;

 

代码:

技术分享
 1 #include <iostream>
 2 #define ll long long
 3 using namespace std;
 4 
 5 const int mode = 1e9 + 7;
 6 const int MAXN = 5e6 + 10;
 7 int prime[MAXN];
 8 
 9 void get_prime(void){
10     for(int i = 2; i < MAXN; i++){
11         if(!prime[i]){
12             for(int j = 1; j * i < MAXN; j++){
13                 if(!prime[i * j]) prime[i * j] = i;
14             }
15         }
16     }
17 }
18 
19 ll get_f(ll n){
20     ll ans = 0;
21     while(n > 1){
22         ll cnt = prime[n];
23         ans += cnt * (cnt - 1) / 2 * (n / cnt);
24         if(ans >= mode) ans %= mode;
25         n /= cnt;
26     }
27     return ans;
28 }
29 
30 int main(void){
31     get_prime();
32     ll t, l, r, ans  = 0, cnt = 1;
33     cin >> t >> l >> r;
34     for(ll i = l; i <= r; i++){
35         ans += cnt * get_f(i);
36         if(ans >= mode) ans %= mode;
37         cnt = cnt * t % mode;
38     }
39     cout << ans << endl;
40     return 0;
41 }
View Code

 

cf822D(质因子)

标签:gif   因子   clu   str   open   cin   lan   index   main   

原文地址:http://www.cnblogs.com/geloutingyu/p/7117401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!