CodeForces-822D 【最小素因子应用】
任意门:https://vjudge.net/problem/CodeForces-822D
D. My pretty girl Noora
1.5 seconds
256 megabytes
standard input
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 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个人参加选美比赛,可以分成N/x,每组x人。每组的比较次数为x(x-1)/2,f[N]为最后决出冠军所需的比较次数,可以通过改变x的值使f[N]改变。题目给出t,l,r(1 ≤ t < 109 + 7, 2 ≤ l ≤ r ≤ 5·106)。求 t^0⋅f(l)+t^1⋅f(l+1)+⋯+t^r−l⋅f(r) 的最小值对1e9+7的模。
解题思路:
要解决题目的那条算式首先需要解决 f ( N ) 这个问题。
f (N) = (N/x) * x*(x-1)/2;
怎样使得 f(N) 尽可能小呢,模拟几个栗子会发现,分组越多比较的次数越少。比如6可以分为3个2或者2个3,所需比较数分别是6和7,8可以分为2个4 或 4个2,分别是 13、10;
所以尽量分下去,直到分到素数 x 为 1,f(N) = N*(N-1)/2;
综上所述(递推方法):
①如果人数为素数,那f[N]=N(N-1)/2;
②如果不是素数,那就找出最小素因子x,分成N/x,每组x人,f[N]=N/x*f[x]+f[N/x]。
官方题解(内附 x 要为素数的证明,不过方法是dp):
Suppose we have already calculated f(2), f(3), ..., f(r). Then calculating the value of the expression is easy.
Consider process of calculating f(x). Suppose we found optimal answer. Represent this answer as sequence of integers d1, d2, ..., dk — on the first stage we will divide girls into groups of d1 participants, on the second stage into groups of d2 participants and so on. Let us prove that all di should be prime.
Suppose some di is a composite number. Then it can be decomposed into two numbers di = a·b. In addition, let n girls are admitted to the i-th stage. Then on current i-th stage
comparisons will occur. But if we divide this stage into two new stages, then number of comparisons is
. So, we proved that all di should be prime. Then it's easy to write DP which will be calculated by transition from the state to the states given by dividing current state by prime divisors. For solving this task we can use Eratosthenes sieve.
Total complexity is same as complexity of Eratosthenes sieve:
.
In addition you can prove the fact that we should split the girls into groups by prime numbers in the order of their increasing. This optimization significantly accelerates the algorithm.
AC code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
const int MAXN = 5e6+;
const LL mod = 1e9+; bool check[MAXN];
LL prime[MAXN];
LL f[MAXN];
int cnt;
/*
void check_prime() //线性筛求素数
{
cnt = 0;
memset(check, false, sizeof(check));
for(LL i = 2; i <= MAXN; i++){
if(!check[i]) prime[++cnt] = i;
for(int k = 1; k <= cnt; k++){
if(i*prime[k] > MAXN) break;
check[i*prime[k]] = true;
if(i%prime[k]) break;
}
}
}
*/ void check_prime(){
memset(check, false, sizeof(check));
for(int i=;i*i<=MAXN;i++){
if(!check[i]){
prime[cnt++]=i;
for(int j=i*i;j<=MAXN;j+=i){
check[j]=true;
}
}
}
} int main()
{
check_prime(); f[] = ;
for(LL i = ; i < MAXN; i++){
if(!check[i]){
f[i] = (i*(i-)/)%mod;
}
else{
LL fac;
for(int k = ; k < cnt; k++){
if(i%prime[k] == ){
fac = prime[k];
break;
}
}
f[i] = (i/fac * f[fac] + f[i/fac])%mod;
}
} LL T, l, r;
scanf("%I64d", &T);
scanf("%I64d %I64d", &l, &r);
LL ans = ;
for(LL i = r; i >= l; i--){
ans = (ans*T)%mod;
ans = (ans + f[i])%mod;
}
printf("%I64d\n", ans);
return ;
}
学习:
http://codeforces.com/blog/entry/53068?locale=en
https://www.cnblogs.com/fu3638/p/7115096.html
最后留个坑:
线性筛法O(N)求素数过不了,但是用Eratosthenes sieve.O(NlogN)可以。
CodeForces-822D 【最小素因子应用】的更多相关文章
- 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 ...
- 题解报告:hdu 5750 Dertouzos(最大真约数、最小素因子)
Problem Description A positive proper divisor is a positive divisor of a number n, excluding n itsel ...
- Codeforces 822D My pretty girl Noora - 线性筛 - 动态规划
In Pavlopolis University where Noora studies it was decided to hold beauty contest "Miss Pavlop ...
- Yet Another Maxflow Problem CodeForces - 903G (最小割,线段树)
大意: 两个n元素集合$A$, $B$, $A_i$与$A_{i+1}$连一条有向边, $B_i$与$B_{i+1}$连一条有向边, 给定$m$条从$A_i$连向$B_j$的有向边, 每次询问修改$A ...
- Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- Codeforces 343E 最小割树
题意及思路:https://www.cnblogs.com/Yuzao/p/8494024.html 最小割树的实现参考了这篇博客:https://www.cnblogs.com/coder-Uran ...
- POJ-1811-Prime Test(pollard_rho模板,快速找最小素因子)
题目传送门 sol:Pollard_Rho的模板题,刚看了Pollard_Rho和Miller_Rabin很多原理性的东西看不懂,只是记住了结论勉强能敲代码. Pollard_Rho #include ...
- Pythagorean Triples(Codeforces Round #368 (Div. 2) + 构建直角三角形)
题目链接: https://codeforces.com/contest/707/problem/C 题目: 题意: 告诉你直角三角形的一条边,要你输出另外两条边. 思路: 我们容易发现除2外的所有素 ...
- codeforces 402 D. Upgrading Array(数论+贪心)
题目链接:http://codeforces.com/contest/402/problem/D 题意:给出一个a串和素数串b .f(1) = 0; p为s的最小素因子如果p不属于b , 否则 . a ...
随机推荐
- 设计模式学习总结(七)适配器模式(Adapter)
适配器模式主要是通过适配器来实现接口的统一,如要实现国内手机在国外充电,则需要在不同的国家采用不同的适配器来进行兼容! 一.示例展示: 以下例子主要通过给笔记本电脑添加类似手机打电话和发短信的功能来详 ...
- easyUI--datagrid 实现按键控制( enter tab 方向键 )
1.表格定义时加上 onClickCell: onClickCell,2.定义列时加入编辑器3.引入 key.js 即可使用 enter 键 或者向下箭头 选中单元格下移 选中单元格上移 tab键 选 ...
- vue中添加util公共方法&&ES6之import、export
vue中添加util公共方法&&ES6之import.export https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Re ...
- Beam编程系列之Apache Beam WordCount Examples(MinimalWordCount example、WordCount example、Debugging WordCount example、WindowedWordCount example)(官网的推荐步骤)
不多说,直接上干货! https://beam.apache.org/get-started/wordcount-example/ 来自官网的: The WordCount examples demo ...
- node.js分片上传文件
前端 : <html> <head> <title>分片上传文件</title> </head> <body> <div ...
- sql and csharp: Split Function
T-SQL: declare @int int,@prov int,@city int,@str nvarchar(500) set @str='天河麗特青春:中國廣東省廣州市天河區天河路623號天河 ...
- java位运算之简单了解
1.十进制转化为二进制 将正整数转化为二进制的方法“除2取余,逆序排列”. 2.二进制转化为十进制 表示整数的二进制,第一位为标志位,0代表为正整数,位数从右开始,第一个位数为0,各位位数记作n,取各 ...
- html和css命名-望文生义
HTML+CSS命名规则 在一个内容较多的HTML页面中,需要设计许多不同的框架,再为这些不同的框架及内容进行分类,给予相应的名称,从而使得网页结构更加清晰,也为工作提供了方便.许多新手朋友在设计一个 ...
- JS监测鼠标指针位置
需求1:鼠标移入正方形的时候,蓝色小圆点跟随鼠标滚动(不许蓝色小圆点超出正方形区域),正方形里实时显示当前鼠标相对于body的坐标. <!DOCTYPE html> <html la ...
- 【阿里云产品公测】小白对OTS两点小建议
作者:阿里云用户荷包蛋 我是大一的新生,作为一个爱技术爱学习爱折腾的熊孩子,我在暑假申请了ECS,学到了很多东西.现在阿里巴巴又开放了很多免费测试,我抱着学习和围观的心态申请了测试,其中有OTS这个高 ...