• Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学


    D. My pretty girl Noora
     
     

    In Pavlopolis University where Noora studies it was decided to hold beauty contest "Miss Pavlopolis University". Let's describe the process of choosing the most beautiful girl in the university in more detail.

    The contest is held in several stages. Suppose that exactly n girls participate in the competition initially. All the participants are divided into equal groups, x participants in each group. Furthermore the number x is chosen arbitrarily, i. e. on every stage number x can be different. Within each group the jury of the contest compares beauty of the girls in the format "each with each". In this way, if group consists of x girls, then  comparisons occur. Then, from each group, the most beautiful participant is selected. Selected girls enter the next stage of the competition. Thus if n girls were divided into groups, x participants in each group, then exactly  participants will enter the next stage. The contest continues until there is exactly one girl left who will be "Miss Pavlopolis University"

    But for the jury this contest is a very tedious task. They would like to divide the girls into groups in each stage so that the total number of pairwise comparisons of the girls is as few as possible. Let f(n) be the minimal total number of comparisons that should be made to select the most beautiful participant, if we admit n girls to the first stage.

    The organizers of the competition are insane. They give Noora three integers tl and r and ask the poor girl to calculate the value of the following expression: tf(l) + tf(l + 1) + ... + tr - l·f(r). However, since the value of this expression can be quite large the organizers ask her to calculate it modulo 109 + 7. If Noora can calculate the value of this expression the organizers promise her to help during the beauty contest. But the poor girl is not strong in mathematics, so she turned for help to Leha and he turned to you.

    Input

    The first and single line contains three integers tl and r (1 ≤ t < 109 + 7, 2 ≤ l ≤ r ≤ 5·106).

    Output

    In the first line print single integer — the value of the expression modulo 109 + 7.

    Example
    input
    2 2 4
    output
    19
    Note

    Consider the sample.

    It is necessary to find the value of .

    f(2) = 1. From two girls you can form only one group of two people, in which there will be one comparison.

    f(3) = 3. From three girls you can form only one group of three people, in which there will be three comparisons.

    f(4) = 3. From four girls you can form two groups of two girls each. Then at the first stage there will be two comparisons, one in each of the two groups. In the second stage there will be two girls and there will be one comparison between them. Total 2 + 1 = 3 comparisons. You can also leave all girls in same group in the first stage. Then  comparisons will occur. Obviously, it's better to split girls into groups in the first way.

    Then the value of the expression is .

     题意:

      给你t,l,r

      求出 

      f函数意义是这样的

      f[x], 在一个舞台上,有x个人,你可以两两比一次赛,决出冠军就是 x*(x-1)/2

      你也可以将其分为任意组,要求每组人数相同,那么就是 x/y * (y)*(y-1)/2  +  f[x/y]

      y是取x的因子的,所以多种取法,要求f[x]最小

      求出表达式的解

    题解:

       因子y必然取是x的最小素数因子,列个式子能够看出来

      那么只要求出5000000下所有数的最小素数因子,f函数就解决了

      这类似素数筛那般,只存最小素数因子

      最后暴力求答案

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define ls i<<1
    #define rs ls | 1
    #define mid ((ll+rr)>>1)
    #define pii pair<int,int>
    #define MP make_pair
    typedef long long LL;
    const long long INF = 1e18+1LL;
    const double pi = acos(-1.0);
    const int N = 1e7+5, M = 1e3+20,inf = 2e9+10;
    
    LL mod = 1e9+7LL;
    LL f[N],t;
    LL l,r,vis[N];
    int main() {
        f[1] = 0;
        for(LL i = 2; i <= 5000000; ++i) {
            if(!vis[i]) {
                f[i] = i;
                for(LL j = i+i; j <= 5000000; j += i) {
                    if(!vis[j])f[j] = i;
                    vis[j] = 1;
                }
            }
        }
        for(LL i = 2; i <= 5000000; ++i) {
            LL nn = (i*(f[i]-1)/2%mod+f[i/f[i]] %mod)%mod;
            f[i] = nn;
        }
        scanf("%lld%lld%lld",&t,&l,&r);
        LL ans = 0;
        LL now = 1;
        for(LL i = l; i <= r; ++i) {
            ans = (ans + now*(f[i]%mod)) % mod;
            now = (now*t)%mod;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    在win7中关闭UAC(用户存取控制)
    如何卸载那些没有出现在“add/remove program”中的程序?
    Win7 打开显示文件后缀
    有关windows 自动登录的registry Key
    原来如此 新学一招
    file's owner以及outlet与连线的理解
    学习笔记:正确使用PresentModalViewController
    学习笔记:UIViewController生命周期
    IPhone之自定义弹出窗口
    学习笔记:iOS 视图控制器(UIViewController)剖析
  • 原文地址:https://www.cnblogs.com/zxhl/p/7134037.html
Copyright © 2020-2023  润新知