#include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; #define ll long long #define re register const int N=1e5+10; const int M=1e5; void read(int &a) { a=0; int d=1; char ch; while(ch=getchar(),!isdigit(ch)) if(ch==‘-‘) d=-1; a=ch^48; while(ch=getchar(),isdigit(ch)) a=(a<<3)+(a<<1)+(ch^48); a*=d; } void write(int x) { if(x<0) putchar(45),x=-x; if(x>9) write(x/10); putchar(x%10+‘0‘); } int pri[N],cnt; ll mu[N]; bool vis[N]; inline void init() { mu[1]=1; for(re int i=2;i<=M;i++) { if(!vis[i]) pri[++cnt]=i,mu[i]=-1; for(re int j=1;j<=cnt&&i*pri[j]<=M;j++) { vis[i*pri[j]]=1; if(i%pri[j]==0) break; mu[i*pri[j]]=-mu[i]; } } for(re int i=1;i<=M;i++) mu[i]+=mu[i-1]; } int main() { init(); int T,cas=0; read(T); while(T--) { cas++; int a,b,c,d,k; read(a); read(b); read(c); read(d); read(k); if(k==0) { printf("Case %d: 0\n",cas); continue; } b/=k; d/=k; if(b>d) swap(b,d); ll ans1=0,ans2=0; for(re int l=1,r;l<=b;l=r+1) { r=min(b/(b/l),d/(d/l)); ans1+=(mu[r]-mu[l-1])*(b/l)*(d/l); } for(re int l=1,r;l<=b;l=r+1) { r=b/(b/l); ans2+=(mu[r]-mu[l-1])*(b/l)*(b/l); } ll ans=ans1-ans2/2; printf("Case %d: %lld\n",cas,ans); } return 0; }
原文:https://www.cnblogs.com/acm1ruoji/p/10821638.html