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 t, l 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 t, l 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个女孩分成x组(x自定,且为n的约数),然后每一组中两两进行比较选出最漂亮的一位参加下一轮选拔。最终剩下的1人是冠军。定义f(n)表示在n个女孩中,选出最漂亮的一位最少需要的比较次数。求

  看到l和r的范围是5e6,大概可以猜到快速预处理出f(i)然后暴力求和。而且看到AC这道题的人数有1000多人,也就是说不太可能是莫比乌斯反演之类的神数论方法。

  关键在于如何快速预处理出f(i)。

  首先写出f(n)的定义式(用数学语言去代替文字语言,某种程度上简化了问题)(d不等于1)。

  再看看数据范围,是不是觉得该用线性筛啊?好,那一定和最小的质因子脱不了干系。然后再举几个数据。

  于是我们再根据数学的直觉和人生的哲理得到当n是合数(素数的时候只有一种转移,可以直接算),每组人数是n的最小质因子的时候最优。(说白了,我就是猜的。但是说实话,比赛的时候确实需要一些直觉。。对于像我这种蒟蒻,如果比赛时花半天耗在证明上,万一证出来没时间写,多亏,还不如骗骗分,得一分算一分,WA再猜,再推。比赛结束了慢慢证明)

  由于想了半天,没有想出来,就打上Lazy标记吧,回去问问学长们。
  为了简化计算,所以证明一下

  然后来证明一下,在转移的时候,合数没有素数优秀。

  设,假设,那么现在需要找多一组合法的转移使得转以后的函数值比这个小。但是很不辛的是,我们可以证明当

  会比它优秀一些。由于f(x)都一样,现在来证明前一个的后面那一坨比后一个后面那一坨大。

  (这一段感谢codeforecs题解,如果没看懂,可以自己去看原文)

  现在我们希望证明,当d1和d2都是素数的时候,且d1 < d2,那么当f(x)先通过d2再通过d1转移到f(n)比先通过d1再通过d2转移更优秀(意思说如果d不是n的最小质因子,那么我就可以构造出一组转移把它更优秀)。这次我们使用作差法。

  

  因为,所以最终的式子的正负性只和有关,因为d1,d2都大于1,所以有。所以

  因此若n的最小质因子为d,则f(n)通过f(n / d)比其它任何质因子p,f(n)通过f(n / p)都要优秀。

  (这一段是我自己证的,有问题请一定指出来,由于我跳了比较多的步骤,所以如果没有看懂,请在评论区提出疑问。)

Code

 /**
* Codeforces
* Problem#882D
* Accepted
* Time: 202ms
* Memory: 29300k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int moder = 1e9 + ; int t, l, r; inline void init() {
scanf("%d%d%d", &t, &l, &r);
} int num = ;
int prime[];
boolean vis[];
int *f;
inline int C2(int n) { return (n * 1LL * (n - ) / ) % moder; }
inline void Euler() {
f = new int[(r + )];
memset(vis, , sizeof(boolean) * (r + ));
f[] = ;
for(int i = ; i <= r; i++) {
if(!vis[i]) prime[num++] = i, f[i] = C2(i);
for(int j = ; j < num && i * prime[j] <= r; j++) {
int c = i * prime[j];
vis[c] = true;
f[c] = (f[i] + (f[prime[j]] * 1LL * i) % moder) % moder;
if((i % prime[j]) == ) break;
}
}
// for(int i = 1; i <= r; i++)
// cout << f[i] << " ";
// cout << endl;
} int res = ;
inline void solve() {
int t0 = ;
for(int i = l; i <= r; i++, t0 = (t0 * 1LL * t) % moder) {
res = (res + t0 * 1LL * f[i]) % moder;
}
printf("%d\n", res);
} int main() {
init();
Euler();
solve();
return ;
}

更新日志

  • 2017-8-2 21:30 补上证明

Codeforces 822D My pretty girl Noora - 线性筛 - 动态规划的更多相关文章

  1. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  2. Codeforces 822D My pretty girl Noora(最小素因子的性质)

    题目大意:一场选美比赛有N个人,可以分成N/x,每组x人.每组的比较次数为x(x-1)/2,f[N]为最后决出冠军所需的比较次数,可以通过改变x的值使f[N]改变.题目给出t,l,r(1 ≤ t &l ...

  3. Codeforces Round #304 (Div. 2)(CF546D) Soldier and Number Game(线性筛)

    题意 给你a,b(1<=b<=a<=5000000)表示a!/b!表示的数,你每次可以对这个数除以x(x>1且x为这个数的因子)使他变成a!/b!/x, 问你最多可以操作多少次 ...

  4. Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)

    F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...

  5. 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

    题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...

  6. Codeforces 1047C (线性筛+因数分解)

    题面 传送门 分析 1.暴力做法 首先先把每个数除以gcd(a1,a2-,an)gcd(a_1,a_2 \dots,a_n )gcd(a1​,a2​-,an​) 可以O(namax)O(n\sqrt ...

  7. Educational Codeforces Round 89 (Rated for Div. 2)D. Two Divisors 线性筛质因子

    题目链接:D:Two Divisors 题意: 给你n个数,对于每一个数vi,你需要找出来它的两个因子d1,d2.这两个因子要保证gcd(d1+d2,vi)==1.输出的时候输出两行,第一行输出每一个 ...

  8. bzoj2693--莫比乌斯反演+积性函数线性筛

    推导: 设d=gcd(i,j) 利用莫比乌斯函数的性质 令sum(x,y)=(x*(x+1)/2)*(y*(y+1)/2) 令T=d*t 设f(T)= T可以分块.又由于μ是积性函数,积性函数的约束和 ...

  9. BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discu ...

随机推荐

  1. Nginx使用rewrite重新定向

    [Rewrite重定向]Nginx使用rewrite重新定向   使用nginx做重新定向. nginx参考网址:http://blog.sina.com.cn/s/blog_97688f8e0100 ...

  2. 软工网络15团队作业4——Alpha阶段敏捷冲刺3.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺3.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  3. TCP连接图示

    转移2018.4.6 自己总结绘图

  4. Object-C-自定义类型归档

    对自定义类型的对象进行本地化保存,那么该类型必须实现NSCoding协议! NSCoding 协议中只有两个方法,都是require的方法,一个是把本身的类型进行编码,一个是解码成类对象,返回一个对象 ...

  5. C# Activator和new的区别

    1.你需要动态的创建一个实例模型的时候,就用Activator.CreateInstance(Type type);如果是明确的知道要创建哪个实例的模型,就可以用 new Class1()了. T t ...

  6. uvalive 3415 Guardian Of Decency

    题意: 有一个老师想组织学生出去旅游,为了避免他们之间有情侣产生,他制定了一系列的条件,满足这些条件之一,那么这些人理论上就不会成为情侣: 身高相差40cm:性别相同:喜欢的音乐风格不同:最喜欢的运动 ...

  7. 大数据处理框架之Strom:容错机制

    1.集群节点宕机Nimbus服务器 单点故障,大部分时间是闲置的,在supervisor挂掉时会影响,所以宕机影响不大,重启即可非Nimbus服务器 故障时,该节点上所有Task任务都会超时,Nimb ...

  8. QtCreator 调试源码

    [1]安装源码 声明:要想调试进入Qt源码,必须首先保证我们安装了Qt源码.下面说明安装Qt源码注意事项. 一般安装过程(默认不安装源码): 安装源码过程(需要自己设置,点击“全选”): 综上所述:Q ...

  9. python os.path.splitext()

    # Split the file extension 可以把扩展名获取出来

  10. redis常见应用场景

    redis应用场景总结redis平时我们用到的地方蛮多的,下面就了解的应用场景做个总结: 1.热点数据的缓存 由于redis访问速度块.支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另 ...