牛客网暑期ACM多校训练营(第三场) H-diff-prime pairs

本文介绍了一种利用素数筛法结合扫描线算法解决特定数学问题的方法。通过预处理得到所有小于等于Max的素数,并统计每个素数倍数的相关数据,最后计算出特定条件下整数对的数量。
//扫描线做法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define  Max  int(1e7)
bool com[Max+10];
ll primes, prime[Max/10+100];
ll  ans[Max+100];
void solve() 
{ 
    primes = 0; 
    memset(com,false,sizeof(com)); 
    com[0] = com[1] = true; 
    for (ll i = 2; i <= Max; ++i) 
    { 
        if (!com[i]) 
            prime[++primes] = i; 
        for (ll j = 1; j <= primes && i*prime[j] <= Max; ++j) 
        { 
            com[i*prime[j]] = true; 
            if (!(i % prime[j])) 
                break; 
        } 
    } 
}
int main() {
    ll n;
    solve();
    scanf("%lld",&n);
    ans[1]=0;
 
        for(ll i=1;i<=primes&&prime[i]<=n;i++)
           {
           	ans[n/prime[i]+1]-=1;//用来后面求每一个倍数里面有多少个数
           	ans[1]++;
		   }   
		  ll num=0;  
		for(ll i=1;i<=n;i++)
		   {
		   	ans[i]=ans[i]+ans[i-1];
		   	num+=1ll*ans[i]*(ans[i]-1)/2;
		   }   
    	printf("%lld\n",2*num);
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值