답안 #16713

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
16713 2015-09-08T09:06:10 Z gs14004 Xtreme gcd sum (kriii2_X) C++14
1 / 4
4000 ms 40900 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;

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;
}

const int maxp = 1e6;

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 main(){
	scanf("%d",&n);
	fill(cnt, cnt + maxp + 1, 1);
	for(int i=0; i<n; i++){
		scanf("%d %d",&a[i], &b[i]);
		int pos = 1, cur = -1;
		int nxt_update = 1;
		while(pos <= maxp){
			if(nxt_update == pos){
				cur = b[i] / pos - (a[i] - 1) / pos;
				nxt_update = 1e9;
				int T = b[i] / pos - 1;
				if(T >= 0){
					int s = (b[i] + T + 1) / (T + 1);
					if(s > pos) nxt_update = min(nxt_update, s);
				}
				T = (a[i] - 1) / pos - 1;
				if(T >= 0){
					int s = (a[i] + T) / (T + 1);
					if(s > pos) nxt_update = min(nxt_update, s);
				}
			}
			cnt[pos] *= cur;
			cnt[pos] %= mod;
			pos++;
		}
	}
	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);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 207 ms 40900 KB Output is correct
2 Correct 202 ms 40900 KB Output is correct
3 Correct 203 ms 40900 KB Output is correct
4 Correct 210 ms 40900 KB Output is correct
5 Correct 206 ms 40900 KB Output is correct
6 Correct 205 ms 40900 KB Output is correct
7 Correct 209 ms 40900 KB Output is correct
8 Correct 212 ms 40900 KB Output is correct
9 Correct 211 ms 40900 KB Output is correct
10 Correct 212 ms 40900 KB Output is correct
11 Correct 230 ms 40900 KB Output is correct
12 Correct 239 ms 40900 KB Output is correct
13 Correct 232 ms 40900 KB Output is correct
14 Correct 236 ms 40900 KB Output is correct
15 Correct 234 ms 40900 KB Output is correct
16 Correct 231 ms 40900 KB Output is correct
17 Correct 230 ms 40900 KB Output is correct
18 Correct 241 ms 40900 KB Output is correct
19 Correct 230 ms 40900 KB Output is correct
20 Correct 232 ms 40900 KB Output is correct
21 Correct 246 ms 40900 KB Output is correct
22 Correct 238 ms 40900 KB Output is correct
23 Correct 235 ms 40900 KB Output is correct
24 Correct 226 ms 40900 KB Output is correct
25 Correct 228 ms 40900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 534 ms 40900 KB Output is correct
2 Correct 537 ms 40900 KB Output is correct
3 Correct 525 ms 40900 KB Output is correct
4 Correct 537 ms 40900 KB Output is correct
5 Correct 534 ms 40900 KB Output is correct
6 Correct 528 ms 40900 KB Output is correct
7 Correct 535 ms 40900 KB Output is correct
8 Correct 527 ms 40900 KB Output is correct
9 Correct 528 ms 40900 KB Output is correct
10 Correct 535 ms 40900 KB Output is correct
11 Correct 3582 ms 40900 KB Output is correct
12 Correct 3589 ms 40900 KB Output is correct
13 Correct 3588 ms 40900 KB Output is correct
14 Correct 3590 ms 40900 KB Output is correct
15 Correct 3589 ms 40900 KB Output is correct
16 Correct 434 ms 40900 KB Output is correct
17 Correct 543 ms 40900 KB Output is correct
18 Execution timed out 4000 ms 40896 KB Program timed out
19 Halted 0 ms 0 KB -