1. 程式人生 > >【JZOJ4714】公約數【數論,數學】

【JZOJ4714】公約數【數論,數學】

題目大意:

題目連結:https://jzoj.net/senior/#main/show/4714
題目圖片:
http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwp1egqfr7j30j70gkglv.jpg
給定一個正整數 n n ,求在 [ 1

, n ] [1,n] 的範圍內,有多少個無序數對 ( a , b )
(a,b)
滿足 g c d ( a , b )
= a   x o r   b gcd(a,b)=a\ xor\ b


思路:

c = g c d ( a , b ) = a   x o r   b c=gcd(a,b)=a\ xor\ b ,證明滿足 g c d ( a , b ) = a   x o r   b gcd(a,b)=a\ xor\ b 必有 a c = a   x o r   c a−c=a\ xor\ c
證明過程
還是比較好理解的。同學寫了證明過程↑,可以直接進去。
所以就列舉 c c ,由於 c c a a 的一個因數( g c d ( a , b ) = c gcd(a,b)=c 中可以得出),所以再列舉 c k = a ck=a 然後判斷即可。


程式碼:

#include <cstdio>
#define R register
using namespace std;

int n,sum;

int main()
{
	scanf("%d",&n);
	for (R int c=1;c<=n;c++)
	 for (R int i=2;c*i<=n;i++)
	 {
	 	int a=c*i;
	 	if (a-c==(a^c)) sum++;
	 }
	printf("%d\n",sum);
	return 0;
}