Analysis:
http://blog.csdn.net/acdreamers/article/details/12871643
See this article for an analysis
Http://wenku.baidu.com/view/fbe263d384254b35eefd34eb.html
Look at this piece of paper
#include <cstdio>#include<cstring>#include<queue>#include<cstdlib>#include<algorithm>#include<vector>#include<cmath>using namespaceStd;typedefLong LongLL;Const intn=5e5+5;Const intinf=0x3f3f3f3f;BOOLVis[n];intPrime[n],mu[n];voidGETMU () {mu[1] =1; intCNT =0; for(intI=2; i<=n-5; i++) { if(!Vis[i]) {prime[cnt++] =i; Mu[i]= -1; } for(intj=0; j<cnt&&i*prime[j]<=n-5; J + +) {vis[i*PRIME[J]] =1; if(I%prime[j]) mu[i*prime[j]] =-Mu[i]; Else{mu[i*PRIME[J]] =0; Break; } } }}intCalintNintx) { intres=0; Do{ ++Res; N/=x; } while(n%x==0); returnRes;}intNum[n];intf[n][ -],t,n,m,p;intMain () {GETMU (); for(intI=2; i<=n-5;++i)if(!Num[i]) for(intj=i;j<=n-5; j+=i) num[j]+=cal (J,i); for(intI=1; i<=n-5;++i) for(intj=i;j<=n-5; j+=i) f[j][num[i]+=mu[j/i]; for(intI=1; i<=n-5;++i) for(intj=1;j< +;++j) F[i][j]+=f[i][j-1]; for(intI=1; i<=n-5;++i) for(intj=0;j< +;++j) F[i][j]+=f[i-1][j]; scanf ("%d",&T); while(t--) {scanf ("%d%d%d",&n,&m,&p); LL ans=0; if(p>= +) {printf ("%i64d\n", 1ll*n*m); Continue; } if(n>m) swap (N,M); for(intI=1, j;i<=n;i=j+1) {J=min (n/(n/i), m/(m/i)); Ans+ = (1ll*f[j][p]-f[i-1][P]) * (n/i) * (m/i); } printf ("%i64d\n", ans); } return 0;}
View Code
HDU 4746 Mophues-mo