Submission #9704

# Submission time Handle Problem Language Result Execution time Memory
9704 2014-09-28T08:12:32 Z ainu7 Xtreme gcd sum (kriii2_X) C++
4 / 4
2380 ms 21208 KB
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <sstream>
#include <set>
using namespace std;

const int max_n = 1000000;
int noprime[max_n+1], mm[max_n+1], trans[max_n+1], inv[max_n+1];
int zero_plus[max_n+1];
long long mmod = 1000000007;

int inv_mod(int a, int b) {
  if (a == 1) return b;
  int div = mmod / a + 1;
  return inv_mod((a * (long long)div) % mmod, (b * (long long)div) % mmod);
}

int main()
{
  int n;
  cin >> n;
  vector<int> a(n), b(n);
  for (int i=0; i<n; i++) cin >> a[i] >> b[i];

/*  if (n == 3) {
    int s = 0;
    for (int i=a[0]; i<=b[0]; i++) for (int j=a[1]; j<=b[1]; j++) for (int k=a[2]; k<=b[2]; k++)
      s = (s + __gcd(i, __gcd(j, k))) % mmod;
    printf("%d\n", s);
  }*/
  noprime[1] = 1;
  for (int i=2; i<=max_n; i++)
    if (!noprime[i])
      for (int j=i*2; j<=max_n; j+=i)
        noprime[j] = 1;

  for (int i=1; i<=max_n; i++) mm[i] = i;
  for (int i=1; i<=max_n; i++)
    for (int j=i*2; j<=max_n; j+=i)
      mm[j] -= mm[i];

  for (int i=1; i<=max_n; i++) inv[i] = inv_mod(i, 1);

  for (int i=1; i<=max_n; i++) trans[i] = 1;
  for (int i=0; i<n; i++) {
    trans[1] = (trans[1] * (long long)(b[i] - a[i] + 1)) % mmod;
    int num = b[i] - a[i] + 1;
    int prv = 1;
    while (1) {
//      printf("%d %d\n", num, prv);
      int bb = b[i] / prv;
      int aa = (a[i]-1) / prv;
      int nxt = 9999999;
      if (bb) nxt = min(nxt, b[i] / bb + 1);
      if (aa) nxt = min(nxt, (a[i]-1) / aa + 1);
      if (nxt > max_n) break;
      int num2 = b[i]/nxt - (a[i]-1)/nxt;

      if (num2 == 0) zero_plus[nxt] ++; else trans[nxt] = (trans[nxt] * (long long)num2) % mmod;
      if (num == 0) zero_plus[nxt] --; else trans[nxt] = (trans[nxt] * (long long)inv[num]) % mmod;

      num = num2;
      prv = nxt;
    }
  }

  int res = 0;
  int pp = 1;
  int zero = 0;
  for (int i=1; i<=max_n; i++) {
    pp = (pp * (long long)trans[i]) % mmod;
    zero += zero_plus[i];
    if (zero) continue;

    int mult = pp;
    res = (res + mult * (long long)mm[i]) % mmod;
    if (res < 0) res += mmod;
  }
  cout << res << endl;
}
# Verdict Execution time Memory Grader output
1 Correct 708 ms 21208 KB Output is correct
2 Correct 704 ms 21208 KB Output is correct
3 Correct 704 ms 21208 KB Output is correct
4 Correct 700 ms 21208 KB Output is correct
5 Correct 700 ms 21208 KB Output is correct
6 Correct 704 ms 21208 KB Output is correct
7 Correct 712 ms 21208 KB Output is correct
8 Correct 704 ms 21208 KB Output is correct
9 Correct 708 ms 21208 KB Output is correct
10 Correct 712 ms 21208 KB Output is correct
11 Correct 720 ms 21208 KB Output is correct
12 Correct 716 ms 21208 KB Output is correct
13 Correct 716 ms 21208 KB Output is correct
14 Correct 712 ms 21208 KB Output is correct
15 Correct 724 ms 21208 KB Output is correct
16 Correct 708 ms 21208 KB Output is correct
17 Correct 700 ms 21208 KB Output is correct
18 Correct 712 ms 21208 KB Output is correct
19 Correct 712 ms 21208 KB Output is correct
20 Correct 724 ms 21208 KB Output is correct
21 Correct 716 ms 21208 KB Output is correct
22 Correct 716 ms 21208 KB Output is correct
23 Correct 712 ms 21208 KB Output is correct
24 Correct 712 ms 21208 KB Output is correct
25 Correct 716 ms 21208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 712 ms 21208 KB Output is correct
2 Correct 704 ms 21208 KB Output is correct
3 Correct 708 ms 21208 KB Output is correct
4 Correct 712 ms 21208 KB Output is correct
5 Correct 700 ms 21208 KB Output is correct
6 Correct 704 ms 21208 KB Output is correct
7 Correct 712 ms 21208 KB Output is correct
8 Correct 708 ms 21208 KB Output is correct
9 Correct 712 ms 21208 KB Output is correct
10 Correct 708 ms 21208 KB Output is correct
11 Correct 892 ms 21208 KB Output is correct
12 Correct 888 ms 21208 KB Output is correct
13 Correct 884 ms 21208 KB Output is correct
14 Correct 880 ms 21208 KB Output is correct
15 Correct 884 ms 21208 KB Output is correct
16 Correct 716 ms 21208 KB Output is correct
17 Correct 724 ms 21208 KB Output is correct
18 Correct 1428 ms 21208 KB Output is correct
19 Correct 1644 ms 21208 KB Output is correct
20 Correct 1316 ms 21208 KB Output is correct
21 Correct 1052 ms 21208 KB Output is correct
22 Correct 2236 ms 21208 KB Output is correct
23 Correct 2380 ms 21208 KB Output is correct
24 Correct 1884 ms 21208 KB Output is correct
25 Correct 1880 ms 21208 KB Output is correct