记录编号 56551 评测结果 AAAAAAAAAA
题目名称 双亲数 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.424 s
提交时间 2013-03-31 16:52:43 内存使用 7.94 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const long long MAXN=1000000+10;
long long g[MAXN]={0};//容斥系数
long long n;//容斥范围
void prime(void){
	bool p[MAXN]={0};//素数
	long long i,j;
	for(i=1;i<=n;i++) g[i]=1;
	for(i=2;i<=n;i++){
		if(p[i]) continue;//如果是素数进入下面的内容
		g[i]=-1;
		for(j=2;j*i<=n;j++){
			p[j*i]=true;//合数
			if(j%i==0) g[j*i]=0;
			else g[j*i]*=-1;
		}
	}
}
long long Multiple(long long a,long long b,long long k){//区间[a,b]内k倍数的个数
	return (b/k)-((a-1)/k);
}
long long calc(long long a,long long b,long long c,long long d,long long k){
	a=(long long)ceil((double)a/(double)k),c=(long long)ceil((double)c/(double)k);
	b/=k,d/=k;
	if(a==0) a=1;
	if(c==0) c=1;
	long long high=min(b,d);
	long long i;
	long long ans=0;
	for(i=1;i<=high;i++){
		if(g[i]==0) continue;
		ans+=Multiple(a,b,i)*Multiple(c,d,i)*g[i];
	}
	return ans;
}
int main(){
	freopen("parents.in","r",stdin);
	freopen("parents.out","w",stdout);
	long long a,b,k;
	scanf("%lld%lld%lld",&a,&b,&k);
	n=max(a,b);
	prime();
	printf("%lld\n",calc(1,a,1,b,k));
	return 0;
}