简单数论 线性筛

Diff-prime Pairs
我们可以发现任意两个的素数都符合题意
但是像 4 , 6 4,6 4,6 这样的合数也符合条件,它本质上就是 2 ∗ 2 , 2 ∗ 3 2*2,2*3 22,23,也就是 2 , 3 2,3 2,3 这对素数的拓展。
那么对于任意一对素数可以拓展多少对呢,我们可以发现他们的 g c d gcd gcd 是相同的,因此决定一对素数贡献的是其中较大的一个素数。
2 ∗ x < = n , 3 ∗ x < = n 2*x<=n,3*x<=n 2x<=n,3x<=n
3 3 3 与比它小的素数 2 2 2 产生的贡献就是 n 3 ( 因 子 含 有 3 的 数 的 个 数 \frac{n}{3}(因子含有3的数的个数 3n3
因此我们记录一下比素数 i i i 小的素数的个数, i i i 与前 c n t cnt cnt 个素数产生的贡献就是 n i ∗ c n t \frac{n}{i} * cnt incnt
code:

#include<bits/stdc++.h>
#define ll long long

using namespace std;
const int maxn = 1e7 + 9;
int p[maxn], v[maxn], cnt;
ll n;
void init()
{
	for(int i = 2; i <= maxn - 9; ++i)
	{
		if(!v[i]) p[++cnt] = i;
		for(int j = 1; j <= cnt && 1ll * i * p[j] <= maxn - 9; ++j)
		{
			v[i * p[j]] = 1;
			if(i % p[j] == 0){
				break;
			}
		}
	}
}

void work()
{
	cin >> n;
	ll ans = 0, cnt = 0;
	for(int i = 2; i <= n; ++i) if(!v[i]){
		ans += (n / i) * cnt;
		++cnt;
	}
	cout << ans * 2 << endl;
}

int main()
{
	ios::sync_with_stdio(0);
	init();
	work();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值