这道题刚开始我真没读懂,后面才发现这个意思:
第0天传给第k个人,然后第k个人在第一天传给所有与它互质的人;如果能传递完那么就是一天就结束了;如果不能传递完那么就需要两天;为什么呢?因为这里用到了一个数论结论:
如果第k个人对应的k+1这个数是个素数,那么如果它的两倍超过了n+1那么肯定其他数与它互质;比如2 3 4 5 6,k=4那么5与其他都互质,所以传递只需要一天就完了,其实也可以这样理解;如果这个数本来就是质数了那么必定它的二倍才和他不是互质的;那么其余情况就是除了与k+1互质的数第一天收到消息,然后再从收到消息的数中去传递给与他们互质的数;那么就只需要两天,这里可以举个栗子:
2 3 4 5 6,k=3时那么第一天传给3 ,5,那么第二天3,5分别传给2,6。所以只需要两天;所以这道题就出来了:
#include<iostream>
using namespace std;
bool is(long long n)
{
for(long long i=2;i*i<=n;i++){//判断素数
if(n%i==0)return false;
}
return true;
}
int main(){
long long n,k;
cin>>n>>k;
if(is(k+1)&&(k+1)*2>(n+1))cout<<1;//如果是素数,并且它的两倍大于了范围,那么肯定其他数与它都互质
else cout<<2;//这里就是其余情况
return 0;
}