Submission #16714

#TimeUsernameProblemLanguageResultExecution timeMemory
16714gs14004Xtreme gcd sum (kriii2_X)C++14
1 / 4
4000 ms44688 KiB
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <limits.h> #include <stack> #include <queue> #include <map> #include <set> #include <algorithm> #include <string> #include <functional> #include <vector> #include <numeric> #include <deque> #include <utility> #include <bitset> #include <iostream> using namespace std; typedef long long lint; typedef long double llf; typedef pair<int, int> pi; const int mod = 1e9 + 7; const int maxp = 1e6; int che[1000005]; int moebius[1000005]; int n; lint mod_inv(int x, int p){ lint ret = 1, piv = x; while(p){ if(p&1) ret *= piv; piv *= piv; ret %= mod; piv %= mod; p >>= 1; } return ret; } void get_moebius(){ for(int i=2; i<=maxp; i++){ for(int j=i; j<=maxp; j+=i){ if(!che[j]) che[j] = i; } } for(int i=1; i<=maxp; i++){ int cnt = 0, lst = -1; int x = i; while(x > 1){ if(lst == che[x]){ cnt = -1; break; } lst = che[x]; x /= lst; cnt++; } if(cnt < 0) continue; moebius[i] = cnt % 2 ? -1 : 1; } } vector<int> change[1000005]; int dx[1000005]; lint cnt[1000005]; int main(){ scanf("%d",&n); fill(cnt, cnt + maxp + 1, 1); for(int i=0; i<n; i++){ int a, b; scanf("%d %d",&a, &b); int pos = 1, cur = -1; int nxt_update = 1; while(pos <= maxp){ cur = b / pos - (a - 1) / pos; nxt_update = 1e9; int T = b / pos - 1; if(T >= 0){ int s = (b + T + 1) / (T + 1); if(s > pos) nxt_update = min(nxt_update, s); } T = (a - 1) / pos - 1; if(T >= 0){ int s = (a + T) / (T + 1); if(s > pos) nxt_update = min(nxt_update, s); } nxt_update = min(nxt_update, maxp + 1); if(cur == 0){ dx[pos]++; dx[nxt_update]--; } else{ cnt[nxt_update] *= mod_inv(cur, mod - 2); cnt[pos] *= cur; cnt[pos] %= mod; cnt[nxt_update] %= mod; } pos = nxt_update; } } for(int i=1; i<=maxp; i++){ cnt[i] *= cnt[i-1]; dx[i] += dx[i-1]; cnt[i] %= mod; } for(int i=1; i<=maxp; i++){ if(dx[i]) cnt[i] = 0; } get_moebius(); lint ret = 0; for(int i=1; i<=maxp; i++){ for(int j=1; i*j<=maxp; j++){ ret += 1ll * i * moebius[j] * cnt[i * j] % mod; ret %= mod; } } ret += mod; ret %= mod; printf("%lld",ret); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...