社区讨论

80pts 求助,赏一关

B4308 [蓝桥杯青少年组国赛 2024] 第三题参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizd4sj
此快照首次捕获于
2025/11/03 18:11
4 个月前
此快照最后确认于
2025/11/03 18:11
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2e7+5;
vector<int> is_prime(N);
vector<int> prime;
vector<bool> cprime(N);
bool isprime(int n){
    for(int i = 2;i*i<=n;i++){
        if(n%i == 0) return 0;
   
    }return 1;
}
int Mobius(int n){
    if(n == 1) return 1;
    for(int i = 1;i*i<=n;i++){
        if(n%(i*i) == 0 && i!=1) return 0;
    }
    int k = 0;
    for(int i = 0;i<prime.size();i++){
        if(n == 1) break;
        if(n%prime[i] == 0){
            n/=prime[i]; k++;
        }
    }
    if(k%2) return -1;
    else return 1;
}
int main(){
    int m,n;
    cin>>m>>n;
    is_prime[0] = is_prime[1] = 0;
    for(int i = 2;i<=n;i++) is_prime[i] = 1;
    for(int i = 2;i<=n;i++){
        if(is_prime[i]){
            prime.push_back(i);
            cprime[i] = 1;
        }
        for(int j = 0;j<prime.size();j++){
            if(i*prime[j]>n) break;
            is_prime[i*prime[j]] = 0;
            if(i%prime[j] == 0) break;
        }
    }
    long long sum = 0;
    for(int i = m;i<=n;i++){
        if(cprime[i] == 1) sum+=(-1);
        else sum+=Mobius(i);
    }cout<<sum<<endl;
    return 0;
}
80pts,俩个TLE

回复

0 条回复,欢迎继续交流。

正在加载回复...