列表

详情


NC22613. 小y的质数

描述

给出一个区间[L,R],求出[L,R]中孪生质数有多少对。
由于这是一个区间筛质数的模板题。所以小k不屑于去写。
所以出题人只好yy了另一道题。
定义k生互质数为满足y + k与y - k互质的数。
现在给出区间[L,R],你需要输出区间内k生互质数有多少对
我们说一对k生互质数在区间[L,R]内,当且仅当

输入描述

一行三个数字L,R,k

输出描述

一行一个数字表示区间[L,R]内的k生互质数的对数

示例1

输入:

5 10 1

输出:

2

说明:

分别为(5,7),(7,9)

示例2

输入:

287 11633 10

输出:

4532

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 496K, 提交时间: 2019-04-19 23:02:08

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll fact[105], cnt;
void getFact(ll x) {
	ll p = 2;
	while (p*p <= x) {
		if (x%p == 0) {
			while (x%p == 0)x /= p;
			fact[cnt++] = p;
		}
		p++;
	}
	if (x > 1)fact[cnt++] = x;
}

ll dfs(ll pos, ll x, ll n) {
	if (pos == cnt) return n / x;
	return dfs(pos + 1, x, n) - dfs(pos + 1, x*fact[pos], n);
}

int main() {
	ll L, R, k; cin >> L >> R >> k;
	if (R - L < 2 * k) cout << 0 << endl;
	else {
		getFact(k * 2);
		cout << dfs(0, 1, R - 2 * k) - dfs(0, 1, L == 0 ? 0 : L - 1) << endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2019-04-19 20:50:09

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int _=1e5+5;
ll L,R,k,a[_],cnt,ans;
void init(ll x){
	for(ll i=2;i*i<=x;++i)
		if(x%i==0){
			a[++cnt]=i;
			while(x%i==0)x/=i;
		}
	if(x>1)a[++cnt]=x;
}
int main(){
	cin>>L>>R>>k; if(L==0)++L;
	R-=k*2; k*=2; init(k);
	if(L>R)cout<<0<<endl,exit(0);
	for(int i=0;i<(1<<cnt);++i){
		ll x=1;
		for(int j=1;j<=cnt;++j)
			if(i>>(j-1)&1)x*=-a[j];
		ans+=R/x-(L-1)/x;
	}
	cout<<ans<<endl;
}

上一题