zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/7117401.html
Copyright © 2011-2022 走看看