-
题意:定义两个数(a,b)是朋友,如果:(gcd(a,b)),(frac{a}{gcd(a,b)}),(frac{b}{gcd(a,b)})能构成三角形,现在给你一个正整数(n),问你(1-n)中有多少数没有朋友.
-
题解:首先考虑合数,设(a=b*c),(bge c),(bge 2,cge 2),我们知道:(gcd(b,b-1)=1),那么:(gcd(b*c,(b-1)*c)=c),则对于:(b*c),((b-1)*c),(gcd(b*c,(b-1)*c)=c),由三角形构成条件不难得到不等式:(b+b-1>c),(b+c>b-1),(b-1+c>b),这三个不等式是恒成立的,所以合数是不满足条件的.
接下来我们考虑质数,对于两个互质的数,我们可以得到三个数(p_1,p_2,1),这三个数永远不可能构成三角形(不多解释了),假如两个质数不互质,那么(p|a),那么我们可以得到三个数:(1,P,frac{a}{p}),而(a)最小为(p^2),如果能构成三角形的话:(p+1>frac{a}{p}),(frac{a}{p}+1>p),所以当且仅当(a=p^2),满足条件,所以对于([1,n])中的质数(p),如果存在(p^2),那么它一定不是孤单的,所以(p^2>n)就是我们此题的核心限制条件,也就转化为我们要求((sqrt{n},n])中的质数个数.
-
代码:
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
#define rep(a,b,c) for(int a=b;a<=c;++a)
#define per(a,b,c) for(int a=b;a>=c;--a)
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
int t;
int n;
int prime[N],cnt;
int res[N];
bool st[N];
void get_prime(int n){
rep(i,2,n){
if(!st[i]){
prime[cnt++]=i;
}
for(int j=0;j<cnt && prime[j]<=n/i;++j){
st[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
res[i]=cnt;
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
get_prime(1000000);
while(t--){
cin>>n;
cout<<res[n]-res[(int)sqrt(n)]+1<<'
'; //不能取到p^2
}
return 0;
}