TJ-CF1423K

CF1423K

首先,我们假设 a>b ,设 gcd(a,b)=c,a=k1×c,b=k2×c
cb<a

则是 c,k1,k2 构成一个三角形,且 k1>k2(k1>1)

分类讨论:

  1. c 为最大值

    c<k1+k2,c>k1>k2

    由于 c,k1,k2 都为正整数,也就是说只要 c>2 就有可能的一组 k1,k2

  2. k1 为最大值

    k1>c,k1<c+k2

    k2=k11 ,则只要 c>1 即可,也就是说要 a,b 不互质。

  3. c=k1(k1>1)

    k1+k2>c ,则 k2>0 ,只要 a,b 不互质即可。

那么,当 a 取什么值的时候,对于任意一个 1b<agcd(a,b) 都为1呢?

显然是质数时,也就是说,合数一定不会是孤独数字

接下来单独考虑质数的情况,设 a 为质数, b=k×a

gcd(a,b)=a ,三角形三边为 a,k,1(a2)

  1. a 为最大值

    a<k+1a>k ,矛盾。

  2. k 为最大值

    k<a+1k>a ,矛盾。

  3. a=k

    显然满足 k<a+1 (k=a) 。此时 b=a2=k2只有在 an 时成立。

f[i] 表示 [1,i] 中的质数的数量,则最后答案为 f[n]f[n]

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+6;
bool vis[N];
int prime[N],cnt;
int sum[N];
inline void work(){
for(int i=2;i<N;i++){
if(!vis[i]){
prime[++cnt]=i;
sum[i]=1;
}
for(int j=1;j<=cnt&&prime[j]*i<N;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(int i=1;i<N;i++) sum[i]+=sum[i-1];
}
int main(){
work();
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("%d\n",sum[n]-sum[(int)sqrt(n)]+1);
}
return 0;
}
posted @   123456xwd  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示