1.
2.
3.
若a,b互质,那么
#include <bits/stdc++.h> using namespace std; const int N=20000; bool vis[N+10]; int tot,prime[N+10],sum[N+10],mu[N+10]; void Mu(int n) { mu[1]=1; for (int i=2; i<=n; i++) { if (!vis[i]) { prime[++tot]=i; mu[i]=-1; } for (int j=1; j<=tot&&prime[j]*i<=n; j++) { vis[prime[j]*i]=1; if (i%prime[j]==0) { mu[i*prime[j]]=0; break; } mu[prime[j]*i]=-mu[i]; } } for (int i=1; i<=n; i++) { sum[i]=sum[i-1]+mu[i]; } } int ans(int n,int m) { if (n>m) { swap(n,m); } int last,ret=0; for (int i=1; i<=n; i=last+1) { last=min(n/(n/i),m/(m/i)); ret+=(n/i)*(m/i)*(sum[last]-sum[i-1]); } return ret; } int main() { Mu(N); int _,a,b,c,d,k,ca=0; scanf("%d",&_); while (_--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); if (k==0) { printf("Case %d: 0\n",++ca); continue; } a--; c--; a/=k; b/=k; c/=k; d/=k; int Ans=ans(b,d)-ans(a,d)-ans(b,c)+ans(a,c); printf("%d\n",Ans); } }
#include <bits/stdc++.h> using namespace std; const int N=200000; typedef long long ll; bool vis[N+10]; ll tot,prime[N+10],sum[N+10],mu[N+10]; void Mu(ll n) { mu[1]=1; for (ll i=2; i<=n; i++) { if (!vis[i]) { prime[++tot]=i; mu[i]=-1; } for (ll j=1; j<=tot&&prime[j]*i<=n; j++) { vis[prime[j]*i]=1; if (i%prime[j]==0) { mu[i*prime[j]]=0; break; } mu[prime[j]*i]=-mu[i]; } } for (ll i=1; i<=n; i++) { sum[i]=sum[i-1]+mu[i]; } } ll ans(ll n,ll m) { if (n>m) { swap(n,m); } ll last,ret=0; for (ll i=1; i<=n; i=last+1) { last=min(n/(n/i),m/(m/i)); ret+=(n/i)*(m/i)*(sum[last]-sum[i-1]); } return ret; } int main() { Mu(N); int _,a,b,c,d,k,ca=0; scanf("%d",&_); while (_--) { scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k); if (k==0) { printf("Case %d: 0\n",++ca); continue; } printf("Case %d: ",++ca); ll ans1=0,ans2=0; b/=k; d/=k; for (int i=1; i<=min(b,d); i++) { ans1+=mu[i]*(b/i)*(d/i); } for (int i=1; i<=min(b,d); i++) { ans2+=mu[i]*(min(b,d)/i)*(min(b,d)/i); } printf("%lld\n",ans1-ans2/2); } }
原文:https://www.cnblogs.com/Accpted/p/11361948.html