记录编号 |
56551 |
评测结果 |
AAAAAAAAAA |
题目名称 |
双亲数 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}