由于某些原因,我需要搞到一定范围内的最长合数段长度。然后:
noilinux@noilinux:~/noip/day5$ ./test
10000000000
get 1 at 5
get 3 at 11
get 5 at 29
get 7 at 97
get 13 at 127
get 17 at 541
get 19 at 907
get 21 at 1151
get 33 at 1361
get 35 at 9587
get 43 at 15727
get 51 at 19661
get 71 at 31469
get 85 at 156007
get 95 at 360749
get 111 at 370373
get 113 at 492227
get 117 at 1349651
get 131 at 1357333
get 147 at 2010881
get 153 at 4652507
get 179 at 17051887
get 209 at 20831533
get 219 at 47326913
get 221 at 122164969
get 233 at 189695893
get 247 at 191913031
get 249 at 387096383
get 281 at 436273291
get 287 at 1294268779
get 291 at 1453168433
get 319 at 2300942869
get 335 at 3842611109
get 353 at 4302407713
语句是在产生更新的时候输出。然后发现从get 43 at 15727开始,所有的更新都是发生在 (10x,5⋅10x) 以内的。对于再往前的,也都在 (0.9⋅10x,5⋅10x) 之内。
不理解为什么会这样。
使用的源代码:
#include<bits/stdc++.h>
#define LL long long
#define XL __int128
using namespace std;
const LL maxn=1e10+10,_maxn=1e10;
const XL bs=1;
bitset<maxn>vis;
int main(){
LL ans=0,N;scanf("%lld",&N);
for(LL i=2;i<=N;i++){
if(vis[i]||bs*i*i>N) continue;
for(LL j=i*i;j<=N;j+=i) vis[j]=1;
}
for(LL i=2,cnt=0;i<=N;i++){
if(vis[i]) cnt++;
else{
if(cnt>ans){ans=cnt;printf("get %lld at %lld\n",cnt,i);}
cnt=0;
}
}
}