【NOIP 2009 提高组】Hankson 的趣味题

一道数论的题,我反正是直接朴素算法来得的50,因为我实在是不会推了。

数学不好我的错咯?

//对于两个正整数a,b,设 gcd(a,b)=k,则存在gcd(a/k,b/k)=1
//gcd(b1/b0,b1/x)=1
//用心体会这两个式子,发现 x 是 a1的整数倍且是 b1 的因子 
//b√1 枚举 b1 的因子(也就是 x ),如果这个数是 a1 的整数倍,并且满足那两个式子,ans++
/*
gcd(x/a1,a0/a1)=1;
gcd(b1/b0,b1/x)=1;
*/

这就是数学家推出来的,至于为什么,我是真的不知道啊,艾哥我对不起你啊。

虽然我们现在学的解析几何

代码这道题推出来就简单了(说的倒是简单,Orz)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(int a,int b) {
    return b==0?a:gcd(b,a%b);
}
int main(){
	int n;
	cin>>n;
	while(n--){
		int a0,a1,b1,b0;
		cin>>a0>>a1>>b0>>b1;
		int sum=0;
		int b=b1/b0;
		int a=a0/a1;
		for(int x=1;x*x<=b1;x++) 
            if(b1%x==0){
                if(x%a1==0&&gcd(x/a1,a)==1&&gcd(b,b1/x)==1) sum++;
                int y=b1/x;
                if(x==y) continue; 
                if(y%a1==0&&gcd(y/a1,a)==1&&gcd(b,b1/y)==1) sum++;
            }
	cout<<sum<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41734244/article/details/79781363