Codeforces 822D 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 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.
The first and single line contains three integers t, l and r (1 ≤ t < 109 + 7, 2 ≤ l ≤ r ≤ 5·106).
In the first line print single integer — the value of the expression modulo 109 + 7.
2 2 4
19
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 - 线性筛 - 动态规划的更多相关文章
- Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...
- 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 ...
- 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, 问你最多可以操作多少次 ...
- Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)
F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...
- 【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) ...
- Codeforces 1047C (线性筛+因数分解)
题面 传送门 分析 1.暴力做法 首先先把每个数除以gcd(a1,a2-,an)gcd(a_1,a_2 \dots,a_n )gcd(a1,a2-,an) 可以O(namax)O(n\sqrt ...
- Educational Codeforces Round 89 (Rated for Div. 2)D. Two Divisors 线性筛质因子
题目链接:D:Two Divisors 题意: 给你n个数,对于每一个数vi,你需要找出来它的两个因子d1,d2.这两个因子要保证gcd(d1+d2,vi)==1.输出的时候输出两行,第一行输出每一个 ...
- bzoj2693--莫比乌斯反演+积性函数线性筛
推导: 设d=gcd(i,j) 利用莫比乌斯函数的性质 令sum(x,y)=(x*(x+1)/2)*(y*(y+1)/2) 令T=d*t 设f(T)= T可以分块.又由于μ是积性函数,积性函数的约束和 ...
- BZOJ 2693: jzptab [莫比乌斯反演 线性筛]
2693: jzptab Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1194 Solved: 455[Submit][Status][Discu ...
随机推荐
- MyBatis基础入门《十九》动态SQL(set,trim)
MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...
- MyBatis基础入门《七》查询参数传入对象
MyBatis基础入门<七>查询参数传入对象 描述: 在执行查询语句的时候,传入的参数是一个对象,依据对象的属性,进行检索数据.此时,书写SQL语句中的条件时,其参数需要和对象中的属性保持 ...
- C#什么时候需要使用构造函数
只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就需要调用默认构造函数.除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例 ...
- C# 对数据库操作的帮助类SQLHelper.cs
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- System.BadImageFormatException”C#报错
在平常的开发中或多或少会遇到一些问题,而本次向小编这里是自己刚刚解决的一个问题,贴出来与大家分享一下,纠结了一个下午,终于解决了,是有关平台的一个报错问题. 方法/步骤 报错”“Syste ...
- javascript 面向对象之路.2 - 小蜜蜂
接着上篇文章继续. 要实现上篇中gif图片的效果, 我们要写js, 算法并不是很复杂, 本次也仅仅展示了实现功能的代码, 并没有从面向对象的角度去构思或重构代码. 这里, 我们定义了一些变量, 用来定 ...
- RabbitMQ理论
RabbitMQ理论 消息 = 有效载荷(数据) + 标签(包含载荷和收件人的信息) 信道:你的应用于RabbitMQ代理服务器之间的TCP连接(有唯一的ID),信道主要解决了每一个线程单独T ...
- 清华操作系统实验--80x86汇编基础
前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...
- Java 内存分配
静态储存区:全局变量,static 内存在编译的时候就已经分配好了,并且这块内存在程序运行期间都存在. 栈储存区:1,局部变量.2,,保存类的实例,即堆区对象的引用.也可以用来保存加载方法时的帧.函数 ...
- linux lsof用法
linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可 ...