CF822D:My pretty girl Noora(数论)

D. My pretty girl Noora
time limit per test
1.5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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: t0·f(l) + t1·f(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 .

题意:n个女仔,选出最美的一个,要求两两比较选出来,可以先分成若干组(每组人数必须相等,且每组人数>1)进行比较,再将每组最美的进行比较,问最优分配方案下最少的比较次数。

思路:考虑dp解决,dp[i]表示i个女仔最少比较次数,假设进行到x个女仔,容易想到枚举x(x为合数)的因子fac,然后dp[i] = min(x/fac*dp[fac] + dp[x/fac]),事实上不用每个因子都枚举,只需要枚举x的质因子即可,即结论是最优分配下每组的人数d一定是素数,因为d若不是素数,那么有d=a*b,要计算d我们依然要将它拆成a个b或者b个a计算,归根到底还是得到d为素数,比如24个人,可以拆成8(组)*3,12(组)*2,有无必要拆成4(组)*6呢?要计算6,我们还得将6拆成2*3,所以没必要,同时最优解一定是拆成最小的素因子。

# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
const int maxn = 5e6;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int l, r, p[maxn+3];
LL t, dp[maxn+3];
void init()
{
    for(int i=0; i<=maxn; ++i) p[i] = i;
    for(int i=2; i<=maxn; ++i)
        if(p[i] == i)
            for(int j=i+i; j<=maxn; j+=i)
                if(p[j] == j)
                    p[j] = i;
}
int main()
{
    init();
    scanf("%lld%d%d",&t,&l,&r);
    dp[0] = 0;
    for(int i=2; i<=r; ++i)
    {
        dp[i] = INF;
        for(int j=i; j!=1; j/=p[j])
            dp[i] = min(dp[i], dp[i/p[j]] + (LL)i*(p[j]-1)/2);
    }
    LL ans = 0, tmp = 1;
    for(int i=l; i<=r; ++i)
    {
        dp[i] %= mod;
        ans = (ans + tmp*dp[i])%mod;
        tmp = tmp*t%mod;
    }
    printf("%lld\n",ans);
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值