lb开金矿 QDUOJ 数论

lb开金矿 QDUOJ 数论

原题链接,点我进去

题意

大家都知道lb有n个小弟(编号从2到n+1),他们可以按照规则传递信息:某天编号为i的小弟收到信息后,那么第二天他会给编号为j的小弟传达信息,其中gcd(i,j)=1(即i,j互质,且j可能不唯一)。现在,lb知道了一个新的钻石矿的信息,lb在第0天的时候告诉了他的第k个小弟(编号为k+1),问几天后他的小弟们都会知道这条消息?

解题思路

这个题看了看输入的数据范围,\(1e14\)的范围,嗯,又看了看样例,回想了一下学长们出题的规律,感觉答案要么是1,要么就是2,但是奈何我不会,后来还是学长讲了一下这个题,让人恍然大悟。

首先,lb通知的第一个小弟会通知和他互素的所有人,这里如果通知的第一个小弟的编号是质数的话,那么好了,他会通知其他所有的小弟,因为质数和其他数都互质,等等,如果有个小弟的编号正好是第一个小弟编号的整数倍的话也是没法通知到的,所以这里需要进行一下特判,判断一下这个质数的2倍是不是超过了n,如果超过了,那么就需要两天,否者就是一天。如果第一个通知的小弟的编号不是质数,那么就需要两天,

代码实现

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
bool judge(ll x)
{
    if(x==2) return true; 
    ll limit=(ll)sqrt(x)+1;
    for(ll i=2; i<=limit; i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}
int main()
{
    ll n, k;
    cin>>n>>k; 
    if(judge(k+1))
    {
        if((k+1)*2 > n+1)
            cout<<1<<endl;
        else
            cout<<2<<endl;
    }
    else 
    {
        cout<<2<<endl;
    }

    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/alking1001/p/11573808.html