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 }
我就是我,颜色不一样的烟火 --- geloutingyu