UCF Local Programming Contest Round 1A E (7月26)
看了好几天,效率有点低,找了好几个的代码,都是有第段代码怎么看都看不懂。这让人很沮丧,后来又去找了给和我代码相近的代码,看完之后,又自己打了一遍,大概弄懂了。
题目:

当初我看到这题是这样想的s e数量级是1e18用long long 然后一个f(x)函数0到x求余等于0就break,然后放到一个数组,代码打出来不行,想着各种求大数求最小质数的方法,最后硬是没用搞出来,泪目了。
后来看了很久代码,不是这个理,题目那个k很重要k<=0.9x(e-s+1),还有s+100《e这个,去网上查了,说是什么容斥原理,意思就是在题目给的范围,必有0.9x(e-s+1)个不是素数。然后问题就解决了。
代码:
#include<bits/stdc++.h>
//100000000000000000 100000000000000010 10
using namespace std;
int p=0;
long long pr[1000005],a[1000005]={0};
bool ispr(int x)
{
if(x==1) return false;
for(int i=2;i*i<x;i++)
{
if(x%i==0) return false;
}
return true;
}
void getpr(void)
{
for(int i=1;i<500;i++)
{
if(ispr(i)) pr[p++]=i;
}
}
int main()
{
long long s,e,k,i,j,sum=0,p1=0;
cin>>s>>e>>k;
getpr();
for(i=s;i<=e;i++)
{
for(j=0;j<p;j++)
{
if(i%pr[j]==0)
{
a[p1++]=pr[j];
break;
}
}
}
sort(a,a+p1);
for(i=0;i<k;i++)
{
sum+=a[i];
}
cout<<sum<<endl;
return 0;
}
以后碰到这种这种问题多试几种方法,别害怕失败,罚时不可怕。