Submission #16699

#TimeUsernameProblemLanguageResultExecution timeMemory
16699gs14004Xtreme gcd sum (kriii2_X)C++14
0 / 4
4000 ms40896 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; int che[1000005]; int moebius[1000005]; int n, a[10005], b[10005], rng[10005]; lint cnt[1000005]; 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; } int maxp; void get_moebius(){ for(int i=2; i<=1000000; 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 main(){ scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d %d",&a[i], &b[i]); } maxp = *max_element(b, b+n); get_moebius(); lint curr = 1; for(int i=0; i<n; i++){ rng[i] = 1; change[1].push_back(i); } for(int i=1; i<=maxp; i++){ for(auto &j : change[i]){ curr *= mod_inv(rng[j], mod - 2); curr %= mod; rng[j] = b[j] / i - (a[j] - 1) / i; curr *= rng[j]; curr %= mod; int s = i+1, e = maxp; while(s != e){ int m = (s+e)/2; if(b[j] / m - (a[j] - 1) / m != rng[j]){ e = m; } else s = m+1; } change[s].push_back(j); } cnt[i] = curr; } 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; } } printf("%lld",ret); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...