欧拉函数有关式ϕ(n)/(n-1)值递减序列性质

欧拉函数有关式 ϕ(n)/(n-1)值的递减序列性质

昨天vijos上有个模拟赛,T2比较有趣。

上题

描述

欧拉函数 \phi(n)ϕ(n) 统计了 11 到 nn 中与 nn 互素的数字个数,例如 \phi(9)=6ϕ(9)=6

现在给定正整数 AA 和 BB,请找出最小的正整数 nn 满足 \frac{\phi(n)}{n-1} < \frac{A}{B}n1ϕ(n)<BA

格式

输入格式

输入只有一行,是两个正整数 AA 和 BB,满足 1\le A<B\le 10^61A<B106

输出格式

输出一个正整数,表示最小满足条件的 nn

样例1

样例输入1

1 2

样例输出1

6

样例2

样例输入2

2 5

样例输出2

12

限制

对于 20\%20% 的数据,保证答案不超过 10^7107

对于 30\%30% 的数据,保证答案不超过 2.5\times 10^{8}2.5×108

对于 40\%40% 的数据,保证答案不超过 7\times 10^{9}7×109

对于 50\%50% 的数据,保证答案不超过 2.5\times 10^{11}2.5×1011

对于 60\%60% 的数据,保证答案不超过 3.5\times 10^{14}3.5×1014

对于 70\%70% 的数据,保证答案不超过 1.5\times 10^{16}1.5×1016

对于 80\%80% 的数据,保证答案不超过 7\times 10^{17}7×1017

对于 90\%90% 的数据,保证答案不超过 3.5\times 10^{30}3.5×1030

对于 100\%100% 的数据,保证答案不超过 10^{200}10200

每一组数据的时限为 11 秒。


这题数据范围一脸不可做的样子= =
于是我们考虑找规律(emmmm不要问我为啥找规律因为我只会找规律qwqwqwqwqwq)
由于题目要求找最小的n,我们运用贪心的思想,找该函数值的递减序列。
我们先从1开始枚举,找10000以内的递减序列

于是我们发现这个数列有不断迭代的特点,即
for(i=r;;i+=r)
if(ϕ(n)==ϕ(n-r))r=i;

T2得了80分
今天上午我又尝试找了一下迭代位置n值的关系
再附上80分迭代:
#include<cstdio>
long long r,m,a,b;
long double c;
long long phi(long long n)
{
    long long ans,i,k;
    if(n==1) 
        ans=1;
    else
    {        
        ans=n;
        k=1;
        for(i=2;n!=1;i+=k)
        {
            if(n%i==0)
            {
                ans/=i;
                ans*=(i-1);
                while(n%i==0) n/=i;
                i=k;
            }
        }
    }
    return ans;
}
int main()
{
    r=1;
    scanf("%lld%lld",&a,&b);
    c=a/1.0/b;
    for(long long i=r;i>0;i+=r)
    {
        m=phi(i);
        if(i-r>0&&m==phi(i-r)) r=i,
        if(c>m/1.0/(i-1))
        {
            printf("%lld",i);
            return 0;
        }
    }
    return 0;
}
每次迭代(r的值改变)时,n的值与上一次迭代的值的商成质数序列

猜你喜欢

转载自blog.csdn.net/qq_39766648/article/details/78173080