QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#790050#9531. Weird CeilingJuliano1TL 136ms4784kbC++142.1kb2024-11-28 00:04:252024-11-28 00:04:25

Judging History

你现在查看的是最新测评结果

  • [2024-11-28 00:04:25]
  • 评测
  • 测评结果:TL
  • 用时:136ms
  • 内存:4784kb
  • [2024-11-28 00:04:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define yes cout<<"Yes"<<endl
#define no cout<<"No"<<endl

using pii = pair<int, int>;

const int maxn = 1e6;
bool NotPrime[maxn + 5];
vector<int> Prime;

bool isPrime(int x) {
	if (x < maxn)return (!NotPrime[x]);
	if (x == 1 || x == 0)return 0;
	int R = sqrt(x) + 1;
	for (int i = 2; i <= R; i++) {
		if (x % i == 0)return 0;
	}
	return 1;
}

void ini() {
	NotPrime[0] = 1;
	NotPrime[1] = 1;
	for (int i = 2; i < maxn; i++) {
		if (NotPrime[i])continue;
		Prime.push_back(i);
		for (int j = 2; i * j < maxn; j++) {
			NotPrime[i * j] = 1;
		}
	}
}

// 质因子分解
vector<pii> solve(int x) {
	map<int, int> cnt;
	for (int i = 0; i < Prime.size(); i++) {
		while (x % Prime[i] == 0) {
			cnt[Prime[i]]++;
			x /= Prime[i];
		}
		if (x > maxn && isPrime(x)) { cnt[x]++; break; }
	}
	
	vector<pii> ans;
	for (auto it : cnt) 
		ans.push_back({ it.first,it.second });
	
	return ans;
}

void get_factor(vector<pii> cnt, set<int>& ans, int idx, int val) {
	if (idx == cnt.size())return;
	// 质因数 now 有 sum 个
	int now = cnt[idx].first;
	int sum = cnt[idx].second;

	int pwr = 1;
	for (int i = 0; i <= sum; i++) {
		val *= pwr;
		ans.insert(val);
		get_factor(cnt, ans, idx+1, val);
		val /= pwr;
		pwr *= now;
	}
}

int func(int a, int b,set<int> &st) {
	auto it = st.upper_bound(b); it--;
	return (int)(a / (*it));
}

int bino(int L0, int n,set<int> st) {
	int L = L0 - 1, R = n + 1;
	int val = func(n, L0,st);
	while (L + 1 != R) {
		int mid = (L + R) / 2;
		int now = func(n, mid,st);
		if (now == val) L = mid;
		else R = mid;
	}
	return L;
}


signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	ini();
	int t; cin >> t;
	while (t--) {
		int n; cin >> n;
		auto cnt = solve(n);
		set<int> st; st.insert(1);
		get_factor(cnt, st, 0, 1);
		int sum = 0;
		int L = 1;
		while (L <= n) {
			int R = bino(L, n,st); // 值为 func(n,L) 的区间
			sum += (R - L + 1) * func(n, L,st);
			L = R + 1;
		}
		cout << sum << endl;
	}

	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 4672kb

input:

3
5
451
114514

output:

21
10251
7075858

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 136ms
memory: 4784kb

input:

1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101...

output:

1
3
7
9
21
16
43
25
37
36
111
41
157
64
71
65
273
73
343
86
113
144
507
101
201
196
163
134
813
137
931
161
221
324
295
169
1333
400
287
205
1641
218
1807
254
277
576
2163
241
589
301
443
326
2757
298
507
317
533
900
3423
315
3661
1024
439
385
625
386
4423
494
737
437
4971
394
5257
1444
551
590
969
...

result:

ok 1000 lines

Test #3:

score: -100
Time Limit Exceeded

input:

1000
999999001
999999002
999999003
999999004
999999005
999999006
999999007
999999008
999999009
999999010
999999011
999999012
999999013
999999014
999999015
999999016
999999017
999999018
999999019
999999020
999999021
999999022
999999023
999999024
999999025
999999026
999999027
999999028
999999029
99999...

output:

969140313
-1726410486
459629095
149860848
1030622429
-1909422146
-1330275445
-2138346165
-68243631
-1259990938
-1421487389
-1665868344
-762561667
-1355522616
1750085139
-1031033803
-1390629783
956252470
-4050461
-2063707598
-1308723339
-421364606
-1473587973
-1071829669
528427357
1264685608
16863671...

result: