题解 XR-3 T2 小道消息

结论的话,传到话的人号码是素数,并且这个数字的两倍大于n,答案为1,否则为2.

伪证(以下涉及的序号均为衣服上的数字而非人的序号):
设号码为tt, t=k+1t = k + 1.若t为素数,则它与2...2t2...2t-11的除了tt外的数均互质,故而答案为1。
然后,若t为素数但是2t<=n2t <= n,这样,1次传话后未被传达的数为nt,t{2,3,4,...}nt, t\in \{2, 3, 4, ...\}。由于t为素数,故t>1t > 1.所以这些数会在第2天传话中被t1t-1t+1t+1传到。
tt不为素数,第一轮传话之后,没有被传到话的人包括:tt的所有质因数,tt的质因数的正整数倍。但是,t1t-1与这些数字都是互素的,所以这些数字都会在第2天被传到。

#include <iostream>
#include <cmath>
#define ull unsigned long long

using namespace std;

int main() {
	ull n, k;
	int sqt;
	cin >> n >> k;
	n++; k++;
	sqt = (int)sqrt(k) + 1;		//不能加太大不然对于小的数sqrt_x + 10甚至会大于x
	bool flag = true;
	if(!(k%2) && k != 2) flag = false;
	for(int i = 3; i <= sqt && flag; i += 2)
		if(!(k%i))
			flag = false;
	if(flag) {
		if((k<<1) > n) cout << 1 << endl;
		else cout << 2 << endl;
	} else {
		cout << 2 << endl;	
	}
	return 0;