結果
問題 | No.1661 Sum is Prime (Hard Version) |
ユーザー |
![]() |
提出日時 | 2021-08-19 23:16:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 128 ms / 3,000 ms |
コード長 | 11,099 bytes |
コンパイル時間 | 2,545 ms |
コンパイル使用メモリ | 222,136 KB |
最終ジャッジ日時 | 2025-01-23 23:01:05 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 22 |
ソースコード
#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#pragma GCC optimize("inline")#include<bits/stdc++.h>using namespace std;template<class T> struct cLtraits_identity{using type = T;};template<class T> using cLtraits_try_make_signed =typename conditional<is_integral<T>::value,make_signed<T>,cLtraits_identity<T>>::type;template <class S, class T> struct cLtraits_common_type{using tS = typename cLtraits_try_make_signed<S>::type;using tT = typename cLtraits_try_make_signed<T>::type;using type = typename common_type<tS,tT>::type;};void*wmem;char memarr[96000000];template<class S, class T> inline auto min_L(S a, T b)-> typename cLtraits_common_type<S,T>::type{return (typename cLtraits_common_type<S,T>::type) a <= (typename cLtraits_common_type<S,T>::type) b ? a : b;}template<class S, class T> inline auto max_L(S a, T b)-> typename cLtraits_common_type<S,T>::type{return (typename cLtraits_common_type<S,T>::type) a >= (typename cLtraits_common_type<S,T>::type) b ? a : b;}template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );(*arr)=(T*)(*mem);(*mem)=((*arr)+x);}template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){walloc1d(arr, x2-x1, mem);(*arr) -= x1;}inline int my_getchar_unlocked(){static char buf[1048576];static int s = 1048576;static int e = 1048576;if(s == e && e == 1048576){e = fread_unlocked(buf, 1, 1048576, stdin);s = 0;}if(s == e){return EOF;}return buf[s++];}struct MY_WRITER{char buf[1048576];int s;int e;MY_WRITER(){s = 0;e = 1048576;}~MY_WRITER(){if(s){fwrite_unlocked(buf, 1, s, stdout);}}};MY_WRITER MY_WRITER_VAR;void my_putchar_unlocked(int a){if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);MY_WRITER_VAR.s = 0;}MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;}inline void wt_L(char a){my_putchar_unlocked(a);}inline void wt_L(int x){int s=0;int m=0;char f[10];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}inline void wt_L(unsigned x){int s=0;char f[10];while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}while(s--){my_putchar_unlocked(f[s]+'0');}}inline void wt_L(long long x){int s=0;int m=0;char f[20];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}inline void wt_L(unsigned long long x){int s=0;char f[21];while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}while(s--){my_putchar_unlocked(f[s]+'0');}}int WRITER_DOUBLE_DIGIT = 15;inline int writerDigit_double(){return WRITER_DOUBLE_DIGIT;}inline void writerDigit_double(int d){WRITER_DOUBLE_DIGIT = d;}inline void wt_L(double x){const int d = WRITER_DOUBLE_DIGIT;int k;int r;double v;if(x!=x || (x==x+1 && x==2*x)){my_putchar_unlocked('E');my_putchar_unlocked('r');my_putchar_unlocked('r');return;}if(x < 0){my_putchar_unlocked('-');x = -x;}x += 0.5 * pow(0.1, d);r = 0;v = 1;while(x >= 10*v){v *= 10;r++;}while(r >= 0){r--;k = floor(x / v);if(k >= 10){k = 9;}if(k <= -1){k = 0;}x -= k * v;v *= 0.1;my_putchar_unlocked(k + '0');}if(d > 0){my_putchar_unlocked('.');v = 1;for(r=(0);r<(d);r++){v *= 0.1;k = floor(x / v);if(k >= 10){k = 9;}if(k <= -1){k = 0;}x -= k * v;my_putchar_unlocked(k + '0');}}}inline void wt_L(const char c[]){int i=0;for(i=0;c[i]!='\0';i++){my_putchar_unlocked(c[i]);}}inline void wt_L(string &x){int i=0;for(i=0;x[i]!='\0';i++){my_putchar_unlocked(x[i]);}}template<class T> inline T pow2_L(T a){return a*a;}inline long long Isqrt_f_L(const long long n){long long r = sqrt(n);r =max_L(r-2, 0);while((pow2_L((r+1)))<= n ){r++;}return r;}long long cReader_ll(long long mn, long long mx, char nx){int i;int fg = 0;int m = 1;int f = -1;long long res = 0;double tmp = 0;for(;;){i = my_getchar_unlocked();if(fg==0 && i=='-'){fg++;m = -1;}else if('0' <= i && i <= '9'){fg++;if(f == -1){f = i - '0';}res = 10 * res + i - '0';tmp = 10 * tmp + i - '0';assert(tmp < 1e20);}else{break;}}assert(tmp / 2 <= res);assert((m==1 && fg >= 1) || (m==-1 && fg >= 2));assert(mn <= m * res && m * res <= mx);assert(!(res == 0 && m == -1));assert(!(res != 0 && f == 0));assert(!(res == 0 && fg >= 2));assert(i == nx);return m * res;}void cReader_eof(){int i;i = my_getchar_unlocked();assert(i == EOF);}long long cntPrime(long long n, void *mem = wmem){int i;int j;int k;int m;int sn;int ssn;int c;char*isp;long long*s1;long long*s2;long long x;long long tmp;const double nn = n;if(n <= 1){return 0;}if(n == 2){return 1;}c = 0;sn =Isqrt_f_L(n);ssn =Isqrt_f_L(sn);walloc1d(&s1, sn+1, &mem);walloc1d(&s2, sn+1, &mem);walloc1d(&isp, sn+1, &mem);s1[0] = 0;for(i=(1);i<(sn+1);i++){s1[i] = i - 1;}for(i=(1);i<(sn+1);i++){s2[i] = n/i - 1;}for(i=(2);i<(sn+1);i++){isp[i] = 1;}for(i=(2);i<(ssn+1);i++){if(isp[i]){for(j=i*i;j<=sn;j+=i){isp[j] = 0;}for(j=(1);j<(sn+1);j++){x = (long long) i * j;if(x > sn){s2[j] -= s1[(int)(nn / x)] - c;}else{s2[j] -= s2[x] - c;}}for(k = (sn+1)/i; k >= i; k--){m =min_L(sn+1, i*(k+1));tmp = s1[k] - c;for(j=(i*k);j<(m);j++){s1[j] -= tmp;}}c++;}}for(i=(ssn+1);i<(sn+1);i++){if(isp[i]){for(j=(1);j<(sn+1);j++){x = (long long) i * j;if(x * i > n){break;}if(x > sn){s2[j] -= s1[(int)(nn / x)] - c;}else{s2[j] -= s2[x] - c;}}c++;}}return s2[1];}template<class T> T sumPrime(long long n, void *mem = wmem){int i;int j;int k;int m;int sn;int ssn;char*isp;long long x;T*s1;T*s2;T c;T tmp;const double nn = n;if(n <= 1){return 0;}if(n == 2){return 2;}c = 0;sn =Isqrt_f_L(n);ssn =Isqrt_f_L(sn);walloc1d(&s1, sn+1, &mem);walloc1d(&s2, sn+1, &mem);walloc1d(&isp, sn+1, &mem);s1[0] = 0;for(i=(1);i<(sn+1);i++){s1[i] = ((T)i) * ((T)(i+1)) / 2 - 1;}for(i=(1);i<(sn+1);i++){s2[i] = ((T)(n/i)) * ((T)(n/i+1)) / 2 - 1;}for(i=(2);i<(sn+1);i++){isp[i] = 1;}for(i=(2);i<(ssn+1);i++){if(isp[i]){for(j=i*i;j<=sn;j+=i){isp[j] = 0;}for(j=(1);j<(sn+1);j++){x = (long long) i * j;if(x > sn){s2[j] -= i * (s1[(int)(nn / x)] - c);}else{s2[j] -= i * (s2[x] - c);}}for(k = (sn+1)/i; k >= i; k--){m =min_L(sn+1, i*(k+1));tmp = i * (s1[k] - c);for(j=(i*k);j<(m);j++){s1[j] -= tmp;}}c += i;}}for(i=(ssn+1);i<(sn+1);i++){if(isp[i]){for(j=(1);j<(sn+1);j++){x = (long long) i * j;if(x * i > n){break;}if(x > sn){s2[j] -= i * (s1[(int)(nn / x)] - c);}else{s2[j] -= i * (s2[x] - c);}}c += i;}}return s2[1];}int main(){wmem = memarr;long long L;long long R;L = cReader_ll(1, 10000000000LL, ' ');R = cReader_ll(L, 10000000000LL, '\n');cReader_eof();wt_L(cntPrime(2*R) - cntPrime(2*L) + cntPrime(R) - cntPrime(L-1));wt_L('\n');return 0;}// cLay version 20210819-1 [beta]// --- original code ---// ll cntPrime(ll n, void *mem = wmem){// int i, j, k, m, sn, ssn, c;// char *isp;// ll *s1, *s2, x, tmp;// const double nn = n;// if(n <= 1) return 0;// if(n == 2) return 1;//// c = 0;// sn = Isqrt_f(n);// ssn = Isqrt_f(sn);// walloc1d(&s1, sn+1, &mem);// walloc1d(&s2, sn+1, &mem);// walloc1d(&isp, sn+1, &mem);//// s1[0] = 0;// rep(i,1,sn+1) s1[i] = i - 1;// rep(i,1,sn+1) s2[i] = n/i - 1;// rep(i,2,sn+1) isp[i] = 1;//// rep(i,2,ssn+1) if(isp[i]){// for(j=i*i;j<=sn;j+=i) isp[j] = 0;// rep(j,1,sn+1){// x = (ll) i * j;// if(x > sn) s2[j] -= s1[(int)(nn / x)] - c;// else s2[j] -= s2[x] - c;// }// for(k = (sn+1)/i; k >= i; k--){// m = min(sn+1, i*(k+1));// tmp = s1[k] - c;// rep(j,i*k,m) s1[j] -= tmp;// }// c++;// }//// rep(i,ssn+1,sn+1) if(isp[i]){// rep(j,1,sn+1){// x = (ll) i * j;// if(x * i > n) break;// if(x > sn) s2[j] -= s1[(int)(nn / x)] - c;// else s2[j] -= s2[x] - c;// }// c++;// }//// return s2[1];// }//// template<class T>// T sumPrime(ll n, void *mem = wmem){// int i, j, k, m, sn, ssn;// char *isp;// ll x;// T *s1, *s2, c, tmp;// const double nn = n;// if(n <= 1) return 0;// if(n == 2) return 2;//// c = 0;// sn = Isqrt_f(n);// ssn = Isqrt_f(sn);// walloc1d(&s1, sn+1, &mem);// walloc1d(&s2, sn+1, &mem);// walloc1d(&isp, sn+1, &mem);//// s1[0] = 0;// rep(i,1,sn+1) s1[i] = ((T)i) * ((T)(i+1)) / 2 - 1;// rep(i,1,sn+1) s2[i] = ((T)(n/i)) * ((T)(n/i+1)) / 2 - 1;// rep(i,2,sn+1) isp[i] = 1;//// rep(i,2,ssn+1) if(isp[i]){// for(j=i*i;j<=sn;j+=i) isp[j] = 0;// rep(j,1,sn+1){// x = (ll) i * j;// if(x > sn) s2[j] -= i * (s1[(int)(nn / x)] - c);// else s2[j] -= i * (s2[x] - c);// }// for(k = (sn+1)/i; k >= i; k--){// m = min(sn+1, i*(k+1));// tmp = i * (s1[k] - c);// rep(j,i*k,m) s1[j] -= tmp;// }// c += i;// }//// rep(i,ssn+1,sn+1) if(isp[i]){// rep(j,1,sn+1){// x = (ll) i * j;// if(x * i > n) break;// if(x > sn) s2[j] -= i * (s1[(int)(nn / x)] - c);// else s2[j] -= i * (s2[x] - c);// }// c += i;// }//// return s2[1];// }//// {// ll L, R;// L = cReader_ll(1, 1d10, ' ');// R = cReader_ll(L, 1d10, '\n');// cReader_eof();// wt(cntPrime(2*R) - cntPrime(2*L) + cntPrime(R) - cntPrime(L-1));// }