Luogu P1072
试题描述Hanks博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。 输入格式第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。 输出格式共n行。每组输入数据的输出结果占一行,为一个整数。 输入示例2 输出示例6 说明第一组输入数据,x可以是9、18、36、72、144、288,共有6个。 注释说明对于50%的数据,保证有1≤a0,a1,b0,b1≤10000且n≤100。 #include<cstdio> using namespace std; typedef long long ll; ll n,a0,b1,ans=1; ll prime[500005],cnt; bool off[500005]; inline void input(ll &x){ ll ans=0,f=1; char c=getchar(); while(c>'9'||c<'0'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ ans=ans*10+ll(c-48); c=getchar(); } x=ans*f; } inline void output(ll x){ if(x<0)putchar('-'),x=-x; if(x>9)output(x/10); putchar(char(x%10+48)); } inline void euler(){ off[0]=off[1]=1; for(ll i=1;i<=50000;i++){ if(!off[i])prime[++cnt]=i; for(ll j=1;j<=cnt&&i*prime[j]<=50000;j++){ off[i*prime[j]]=1; if(i%prime[j]==0)break; } } } inline void work(ll x){ ll ina0=0,ina1=0,inb0=0,inb1=0; while(a0%x==0)a0/=x,ina0++; while(a1%x==0)a1/=x,ina1++; while(b0%x==0)b0/=x,inb0++; while(b1%x==0)b1/=x,inb1++; if(ina0<ina1||inb0>inb1)ans=0; if(ina0>ina1){ if(inb0<inb1){ if(ina1==inb1)ans*=1;else ans=0; } else if(inb0==inb1){ if(ina1<=inb1)ans*=1;else ans=0; } } if(ina0==ina1){ if(inb0<inb1){ if(ina1<=inb1)ans*=1;else ans=0; } else if(inb0==inb1){ if(ina1<=inb1)ans*=(inb1-ina1)+1; else ans=0; } } } int main(){ euler(); input(n); for(ll i=1;i<=n;i++){ ans=1; input(a0);input(a1);input(b0);input(b1); //gcd(x,a0)=a1; //lcm(x,b0)=b1; for(ll i=1;i<=cnt;i++){ work(prime[i]); } if(b1!=1)work(b1); output(ans); putchar('n'); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |