D. My pretty girl Noora(数论,dp)
2017-07-04 08:01
489 查看
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
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
Output
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个人,我们如何让他的比较次数最小?
这样,我们把他分成b份,每一份有a个,就有n=a*b;
那么如何让他比较的次数最小呢,其实就是让a尽量的小(a>1),b尽量的大,如果能分解就继续分解,直到不能分解的时候。
例如,n=6;分解为6=2*3,那么3+3是六次
n=8;8=4*2 那么4+2=6次
由此得到状态转移方程,令N为当前人数,T为n的最小质因数
DP
=(N/T)*DP[ T ]+DP[ N/T ]
CF上的题解我没看懂,我是这么做的:
首先线性筛选出1-5e6内所有的质数。
然后就是找出一个数最小的质数,其实就是从2-sqrt(i)内循环跑一遍,这样如果找到一个可以整除的就跳出,并且这个数字就是i最小的质数。
代码如下
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
const int M=5e6+10;
const int mod=1e9+7;
bool isprime[M];
long long dp[M];
void init()
{
//memset(isprime,0,sizeof(isprime));
isprime[1]=1;
for(long long i=2; i<M; i++)
{
//printf("yes\n");
if(!isprime[i])
{
for(long long j=i*i; j<M; j+=i)
{
isprime[j]=1;
}
}
}
}
int main()
{
init();
int t,l,r;
long long sum=0;
while(scanf("%d%d%d",&t,&l,&r)!=EOF)
{
//int a=clock();
for(int i=2; i<M; i++)
{
if(!isprime[i])
{
dp[i]=(long long)(i-1)*i*0.5;
}
else
{
int t=sqrt(i);
int ans;
for(int j=2; j<=t; j++)
{
if(i%j==0)
{
ans=j;
break;
}
}
dp[i]=(i/ans)*dp[ans]+dp[i/ans];
}
}
int k=r-l;
long long c=1;
for(int i=0; i<=k; i++)
{
if(i==0)
sum+=((dp[l-i])%mod);
else
{
sum+=(((dp[l+i]%mod)*c)%mod);
}
sum%=mod;
//printf("%lld\n",c);
c=(c*t)%mod;
}
printf("%lld\n",sum);
// int b=clock();
// printf("%d\n",b-a);
}
}
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
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个人,我们如何让他的比较次数最小?
这样,我们把他分成b份,每一份有a个,就有n=a*b;
那么如何让他比较的次数最小呢,其实就是让a尽量的小(a>1),b尽量的大,如果能分解就继续分解,直到不能分解的时候。
例如,n=6;分解为6=2*3,那么3+3是六次
n=8;8=4*2 那么4+2=6次
由此得到状态转移方程,令N为当前人数,T为n的最小质因数
DP
=(N/T)*DP[ T ]+DP[ N/T ]
CF上的题解我没看懂,我是这么做的:
首先线性筛选出1-5e6内所有的质数。
然后就是找出一个数最小的质数,其实就是从2-sqrt(i)内循环跑一遍,这样如果找到一个可以整除的就跳出,并且这个数字就是i最小的质数。
代码如下
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
const int M=5e6+10;
const int mod=1e9+7;
bool isprime[M];
long long dp[M];
void init()
{
//memset(isprime,0,sizeof(isprime));
isprime[1]=1;
for(long long i=2; i<M; i++)
{
//printf("yes\n");
if(!isprime[i])
{
for(long long j=i*i; j<M; j+=i)
{
isprime[j]=1;
}
}
}
}
int main()
{
init();
int t,l,r;
long long sum=0;
while(scanf("%d%d%d",&t,&l,&r)!=EOF)
{
//int a=clock();
for(int i=2; i<M; i++)
{
if(!isprime[i])
{
dp[i]=(long long)(i-1)*i*0.5;
}
else
{
int t=sqrt(i);
int ans;
for(int j=2; j<=t; j++)
{
if(i%j==0)
{
ans=j;
break;
}
}
dp[i]=(i/ans)*dp[ans]+dp[i/ans];
}
}
int k=r-l;
long long c=1;
for(int i=0; i<=k; i++)
{
if(i==0)
sum+=((dp[l-i])%mod);
else
{
sum+=(((dp[l+i]%mod)*c)%mod);
}
sum%=mod;
//printf("%lld\n",c);
c=(c*t)%mod;
}
printf("%lld\n",sum);
// int b=clock();
// printf("%d\n",b-a);
}
}
相关文章推荐
- CF822D:My pretty girl Noora(数论)
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora(数论)
- cf 822D - My pretty girl Noora 【数论+递推】
- Codeforces Round #422 D. My pretty girl Noora (数论)
- Codeforces 822 D. My pretty girl Noora(多项式加法+dp)
- CF Round #422( Div.1/2) D. My pretty girl Noora
- codeforces 822 My pretty girl Noora(递推)
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学
- 【埃式筛法】My pretty girl Noora CodeForces - 822D
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora 动态规划
- D. My pretty girl Noora(Round422)
- 【Codeforces Round #422 (Div. 2) D】My pretty girl Noora
- 【Codeforces Round #422 (Div. 2) D】My pretty girl Noora
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora
- my pretty girl
- HDU5800 To My Girlfrend(计数dp)
- LightOJ1119 Pimp My Ride(状压DP)
- HDU4719-Oh My Holy FFF(DP线段树优化)
- HDU 5800 To My Girlfriend(dp)
- bzoj3209: 花神的数论题(数位Dp)