- 当
k
为
合
数
时
,
答
案
为
0
k为合数时,答案为0
k为合数时,答案为0
- 重点是要找出最小质因子为
k
的
k的
k的数,然后统计答案,可以用线性筛实现
- 开数组的时候要注意内存
50分Code:
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 10000010
long long L,R,k;
int v[maxn],pre[maxn];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline bool is_prime_(int x) {
if(x==1) return false;
for(int i=2;i<=sqrt(x);++i) {
if(!(x%i)) return false;
}
return true;
}
inline void work_() {
long long ans=0;
if(k>=L&&k<=R) ans=k;
ans%=mod;
v[1]=1;int cnt=0;
for(int i=2;i<=10000000;++i) {
if(!v[i]) {
v[i]=i;
pre[++cnt]=i;
}
for(int j=1;j<=cnt;++j) {
if(v[i]<pre[j]||i*pre[j]>10000000) break;
v[i*pre[j]]=pre[j];
if(pre[j]==k&&(i*pre[j])>=L&&(i*pre[j]<=R)) {
ans+=i*pre[j];
ans%=mod;
}
}
}
printf("%lld",ans%mod);
}
void readda_() {
scanf("%lld%lld%lld",&L,&R,&k);
if(!is_prime_(k)) {
printf("0");
exit(0);
}
}
int main() {
freopen("a.txt","r",stdin);
readda_();
work_();
return 0;
}