萌新初学杜教筛,不知为何一直RE,求助
查看原帖
萌新初学杜教筛,不知为何一直RE,求助
661641
Cx114514楼主2024/10/23 10:03
#include <bits/stdc++.h>
#define int long long
using namespace std;

int mod, n, inv6, cnt, phi[5000005], vis[5000005], prime[5000005], ans[5000005];

int Qpow(int t, int p)
{
	int Ans = 1;
	while (p)
	{
		if (p & 1) Ans = (Ans * t) % mod;
		t = (t * t) % mod;
		p /= 2;
	}
	return Ans;
}

int sum2(int x)
{
	x %= mod; 
	return ((x * (x + 1) % mod) * (2 * x + 1) % mod) * inv6 % mod;
}

int sum3(int x)
{
	x %= mod;
	return ((x * (x + 1) / 2) % mod) * ((x * (x + 1) / 2) % mod) % mod;
}

unordered_map < int, int > m;

int S2(int x)
{
	if (x <= 5000000) return ans[x];
	if (m.count(x)) return m[x];
	int res = sum3(x);
	for (int l = 2, r; l <= x; l = r + 1)
	{
		r = x / (x / l);
		res = ((res - (sum2(r) - sum2(l - 1)) * S2(x / l)) % mod + mod) % mod;
	}
	return m[x] = res;
}

int S(int x)
{
	int res = 0;
	for (int l = 1, r = 0; l <= x; l = r + 1)
	{
		r = x / (x / l);
		res = (res + (((S2(r) - S2(l - 1)) % mod + mod) % mod) * sum3(x / l)) % mod;
	}
	res = (res + mod) % mod;
	return res;
}

signed main()
{
	phi[1] = 1;
	for (int i = 2; i <= 5000000; i++)
	{
		if (!vis[i])
		{
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		for (int j = 1; j <= cnt && i * prime[j] <= 5000000; j++)
		{
			vis[i * prime[j]] = 1;
			if (i % prime[j] == 0)
			{
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			phi[i * prime[j]] = phi[i] * phi[prime[j]];
		}
	}
	for (int i = 1; i <= 5000000; i++)
		ans[i] = (ans[i - 1] + (phi[i] * i % mod) * i) % mod;
	cin >> mod >> n;
	inv6 = Qpow(6, mod - 2);
	cout << S(n) << endl;
    return 0;
}


2024/10/23 10:03
加载中...