GCD XOR UVA - 12716 (gcd(),异或)

    xiaoxiao2021-03-25  7

    直击题目:https://vjudge.net/problem/49096/origin

    题目大意:

    输入整数n(1<=n<=30000000),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=aXORb。例如n=7时有4对:(3,2),(5,4),(6,4),(7,6)

    ps:紫书p318,这个题如果是在赛场上自己是真推导不出来,根本就想不到啊,惭愧。。。

    题解见紫书吧,自己的感悟就是弱。满足这样条件的会发现如果c=aXORb=gcd(a,b),那么b=a-c;而且c是a的约数,所以枚举a和c就行了,枚举的时候用类似于素数筛的方法

    #include <iostream> #include <bits/stdc++.h> using namespace std; int h[35000000]={0}; void init() { for(int c=1;c<=15000000;c++) { for(int a=c*2;a<=30000500;a=a+c) { int b=a-c; if((a^b)==c)h[a]++; } } for(int i=2;i<=30000500;i++) { h[i]+=h[i-1]; } } int main() { init(); int t; cin>>t; int w=0; while(t--) { int n; cin>>n; cout<<"Case "<<++w<<": "<<h[n]<<endl; } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-156109.html

    最新回复(0)