首页 > 代码库 > cf822D(质因子)

cf822D(质因子)

题目链接: 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(质因子)