UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#203224#571. 斐波那契tkswls100273ms80536kbC++1.5kb2024-02-21 07:54:142024-02-21 12:09:41

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, f[2000006], b[2000006], sum[2000006], prime[2000006], ccnt, mo[2000006], ans, ssum[2000006];
const int mod = 1000000007;
inline int calc(int p, int q) {
	int cnt = 0;
	for (int l = 1, r; l <= min(p, q); l = r + 1) {
		r = min(p / (p / l), q / (q / l));
		r = min(r, min(p, q));
//		cout << l << '-' << r << "-" << p / l << "-" << q / l << ' ' << mo[r] - mo[l - 1] << "p[]\n";
		cnt = cnt + ((sum[r] - sum[l - 1] + mod) % mod) * (p / l) % mod * (q / l) % mod;
		cnt %= mod;
	}
	return cnt;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	f[1] = f[2] = 1;
	for (int i = 3; i <= max(n, m); i++) {
		f[i] = f[i - 1] + f[i - 2];
		f[i] %= mod;
	}
	mo[1] = 1;
	for (int i = 2; i <= max(n, m); i++) {
		if (!b[i]) {
			b[i] = i, prime[++ccnt] = i;
			mo[i] = -1;
		}
		for (int j = 1; j <= ccnt && i * prime[j] <= max(n, m); j++) {
			b[i * prime[j]] = prime[j];
			if (i % prime[j] == 0) {
				mo[i * prime[j]] = 0;
				break;
			} else {
				mo[i * prime[j]] = -mo[i];
			}
		}
	}
	for (int i = 1; i <= max(n, m); i++) {
		sum[i] = sum[i - 1] + mo[i];
		sum[i] = (sum[i] + mod) % mod;
	}
	for (int i = 1; i <= min(n, m); i++) {
		ssum[i] = (ssum[i - 1] + f[i]) % mod;
	}
	for (int l = 1, r; l <= min(n, m); l = r + 1) {
		r = min(n / (n / l), m / (m / l));
		r = min(r, min(n, m));
		ans = ans + (ssum[r] - ssum[l - 1] + mod) % mod * calc(n / l, m / l);
		ans %= mod;
	}
	cout << ans;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 0ms
memory: 1272kb

input:

10 10

output:

251

result:

ok single line: '251'

Test #2:

score: 10
Accepted
time: 0ms
memory: 1312kb

input:

1000 981

output:

201652910

result:

ok single line: '201652910'

Test #3:

score: 10
Accepted
time: 0ms
memory: 1308kb

input:

906 1000

output:

524439478

result:

ok single line: '524439478'

Test #4:

score: 10
Accepted
time: 0ms
memory: 1316kb

input:

1000 1000

output:

542559755

result:

ok single line: '542559755'

Test #5:

score: 10
Accepted
time: 0ms
memory: 1288kb

input:

507 507

output:

112783388

result:

ok single line: '112783388'

Test #6:

score: 10
Accepted
time: 3ms
memory: 5248kb

input:

100000 100000

output:

766972956

result:

ok single line: '766972956'

Test #7:

score: 10
Accepted
time: 38ms
memory: 40948kb

input:

1000000 1000000

output:

272430913

result:

ok single line: '272430913'

Test #8:

score: 10
Accepted
time: 65ms
memory: 71992kb

input:

2000000 905234

output:

57001167

result:

ok single line: '57001167'

Test #9:

score: 10
Accepted
time: 93ms
memory: 72352kb

input:

951250 2000000

output:

390388595

result:

ok single line: '390388595'

Test #10:

score: 10
Accepted
time: 74ms
memory: 80536kb

input:

2000000 2000000

output:

46360093

result:

ok single line: '46360093'