欧拉函数有关式 ϕ(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}n−1ϕ(n)<BA。
格式
输入格式
输入只有一行,是两个正整数 AA 和 BB,满足 1\le A<B\le 10^61≤A<B≤106。
输出格式
输出一个正整数,表示最小满足条件的 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 秒。
#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的值与上一次迭代的值的商成质数序列