# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
16715 | 2015-09-08T09:38:31 Z | gs14004 | Xtreme gcd sum (kriii2_X) | C++14 | 0 ms | 0 KB |
#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; 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; } } int dx[1000005]; lint cnt[1000005]; lint inv[1000005]; int main(){ scanf("%d",&n); for(int i=1; i<=maxp; i++){ lint ret = 1, piv = x; while(p){ if(p&1) ret *= piv; piv *= piv; ret %= mod; piv %= mod; p >>= 1; } inv[i] = ret; } 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] *= inv[cur]; 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); }