题解分享
题解分享简介
神秘数字(结果填空) - 题解
暴力for 重要的是不等式两边开根号
```public
static int count = 0;
public static boolean check(int num) {
for (int i = 2; i < num; i++) {
if(num%i==0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
int k = 0;
for (int i = 2; i < 20250309; i++) {
for (int j = 2; j < 20250309; j++) {
if(j*Math.sqrt((double)(i*j))>Math.sqrt((double)20250309)) {
break;
}
if(j<i) {
continue;
}
if(check(i)&&check(j)&&i<j&&i*j*j*j<20250309) {
count++;
}
}
}
System.out.println(count);
}
}
```
查看全文
0
0
0
3
神秘数字(结果填空) - 题解
本题直接暴力貌似要跑好长时间,可能是我暴力写错了,这道题可以先使用欧拉筛将质数都先筛出来,之后枚举q来二分查找p,那这道题就出来了
```
#include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<array>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
using i64=long long;
//using i128=__int128;
const i64 INF=1e18;
const int mod=998244353;
//const int N=1e9+7;
const int N=300;
int primes[N],cnt=0;
bool vis[N];
void init(){
for(int i=2;i<=N;i++){
if(!vis[i])primes[++cnt]=i;
for(int j=1;i*primes[j]<=N;j++){
vis[i*primes[j]]=true;
if(i%primes[j]==0)break;
}
}
}
void solve(){
init();
i64 ans=0;
int k=20250309;
for(int i=1;i<=cnt;i++){
i64 q=primes[i];
i64 q_sub=q*q*q;
//找到符合题意p的最大值
i64 max_p=k/q_sub;
max_p=min(max_p,q-1);
if(max_p<2)continue;
//进行二分查找
int pos=upper_bound(primes+1,primes+1+cnt,max_p)-primes;
ans+=distance(primes+1,primes+pos);
}
cout<<ans<<'\n';
}
int main(){
int _=1;
//cin>>_;
while(_--)solve();
return 0;
}
```
查看全文
0
0
0
2



