HDU 4479 GCD and LCM (組合數學)
阿新 • • 發佈:2018-12-11
#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #define read(x,y) scanf("%d%d",&x,&y) #define ll long long #define lrt int l,int r,int rt #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define root l,r,rt const int maxn =1e5+5; const int mod=1e9+7; ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;} ll gcd(ll x,ll y){return y?gcd(y,x%y):x;} ll lcm(ll x,ll y){return x/gcd(x,y)*y;} /* 題目大意:給定兩個式子, 求解x,y,z的數量,lcm(x,y,z)=l,gcd(x,y,z)=g 給定l和g,求通解的個數。 首先推導下就可以知道把式子轉化成, lcm(x,y,z)=l/g,gcd(x,y,z)=1; 如果l不整除g則直接輸出0, 否則質因數分解, 其實數論的很多組合題目都有個唯一質因分解定理在操縱, 這道題也不例外, 我們不從整體考慮,先從單個質因子考慮, 對於一個pi^ai,首先三個數中,ai一定要取到, 並且至少有個零,對於這個約束條件,這題就簡單了。 ai,{1,2,...ai},0,對於這個組合條件,有6ai-3種, 再加上,ai,0,0三種,總共6ai種,質因分解就行。 */ int prim[maxn],tot=0; int vis[maxn]; void sieve() { for(int i=2;i<maxn;i++) { if(vis[i]==0) prim[tot++]=i; for(int j=0;j<tot;j++) { if(1LL*i*prim[j]>=maxn) break; int k=i*prim[j];vis[k]=1; if(i%prim[j]==0) break; } } } int n,m; int main() { sieve(); int t;scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(m%n) puts("0"); else { m/=n; ll ans=1,cnt=0; for(int i=0;prim[i]<=m&&i<tot;i++) { cnt=0; while(m%prim[i]==0) { m/=prim[i]; cnt++; } if(cnt) ans=ans*6*cnt; } if(m>1) ans*=6; printf("%lld\n",ans); } } return 0; }