HDU 1695 GCD(数論)

2464 ワード

転送ゲート:http://acm.hdu.edu.cn/showproblem.php?pid=1695
1<=x==n,1<=y==m,の中にはgcd(x,y)=kというペアがどれぐらいありますか?gcd(x,y)とgcd(y,x)は一つです。
クイズ:
第一の考え:今日はいくつかのGCDについてのテーマを作っていますが、1<=x==n/k、1<=y==m/kはgcd(x,y)=1を抽象化できます。新しい視野OJ 2005[Noi 2010]のエネルギー収集(数論-gcd)という問題は同じです。最後にEla関数min(n/k,m/k=k)とgxをマイナスします。
第二の考え:問題解は全部容斥原理で解いたのを見ました。急に優越感がありました。あとでも原理コードを貼ります。
第一ACコード:
Acceepted
1695
109 MS
1956 K
1787 B
G++
XH_Revenn
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s)  scanf("%s",s)
#define pi1(a)    printf("%d
",a) #define pi2(a,b) printf("%d %d
",a,b) #define mset(a,b) memset(a,b,sizeof(a)) #define forb(i,a,b) for(int i=a;i<b;i++) #define ford(i,a,b) for(int i=a;i<=b;i++) typedef __int64 LL; const int N=100015; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-7; LL f[N],phi[N]; LL xiaohao(LL p) { mset(phi,0); phi[1]=1; for(LL i=2;i<=p;i++) { if(!phi[i]) { for(LL j=i;j<=p;j+=i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } for(LL i=1;i<=p;i++) phi[i]=phi[i-1]+phi[i]; } int main() { xiaohao(100000); int T,ca=0; cin>>T; LL n,m,a,b,k; while(T--) { cin>>a>>n>>b>>m>>k; if(n>m) swap(n,m); printf("Case %d: ",++ca); if(k==0||n<k)// n<k { puts("0"); continue; } n/=k; m/=k; mset(f,0); LL sum=0; for(LL i=n;i>=1;i--) { f[i]=(n/i)*(m/i); for(int j=i+i;j<=n;j+=i) f[i]-=f[j]; } cout<<(f[1]-phi[n]+1)<<endl; } return 0; }