为什么只有7分

P1865 A % B Problem

@[Roll_SKY_da_shen](/space/show?uid=175011) 请使用线性筛+前缀和,您的方法时间复杂度过高了
by Celestial_Scarlet @ 2019-04-20 14:47:04


看一下我的吧: ```cpp #include <cstdio> #define maxn 1000005 using namespace std; int f[maxn]; bool IsPrime[maxn]; void initialise() { for(int i = 2; i <= maxn; ++i) IsPrime[i] = true; } void Ai_Prime() { initialise(); f[1] = 0; for(int i = 2; i <= maxn; ++i) { if(IsPrime[i]) { f[i] = f[i - 1] + 1; for(int j = 2 * i; j <= maxn; j += i) IsPrime[j] = false; } else f[i] = f[i - 1]; } } int main() { Ai_Prime(); int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) { int l, r; scanf("%d%d", &l, &r); if((l < 1) || (r > m)) printf("Crossing the line\n"); else { int ans = f[r] - f[l - 1]; printf("%d\n", ans); } } return 0; } ```
by Eason_AC @ 2019-04-20 15:09:57


我做的: ```c #include<bits/stdc++.h> using namespace std; bool f[1000001]={0},dis[1000001]={0}; inline void Jack(int m){ int i,j,k; for(i=2;i<=m;i++){ if(dis[i])continue; f[i]=1; k=i*2; while(k<=m){ dis[k]=1; k+=i; } } } //线性筛 int main( ){ std::ios::sync_with_stdio(false); int n,m,i,l,r; cin>>n>>m; Jack(m); int ans[m+1]; ans[1]=ans[0]=0; for(i=2;i<=m;i++)if(f[i])ans[i]=ans[i-1]+1;else ans[i]=ans[i-1]; for(i=1;i<=n;i++){ cin>>l>>r; if(l<1||r>m)cout<<"Crossing the line"<<endl; else cout<<ans[r]-ans[l-1]<<endl; } } ``` 线性筛大致原理: ![](https://upload-images.jianshu.io/upload_images/3281836-3aebffb6f6896060.gif?imageMogr2/auto-orient/) 很容易实现的,并不特别难,就可以求出1-m之间的所有素数 然后就好做了
by Space_Gold_Trash @ 2019-04-20 16:10:31


|