第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 J题

翻转硬币

  • ==问题描述==
  • ==格式输入==
  • ==格式输出==
  • ==样例输入==
  • ==样例输出==
  • ==评测用例规模与约定==
  • ==解析==
  • ==参考程序==

问题描述

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 J题_第1张图片


格式输入

输入一行包含一个整数 n 。


格式输出

输出一行包含一个整数表示最少需要的操作次数。


样例输入

  1. 7 2. 6

样例输出

  1. 1131796 2. 688042

评测用例规模与约定

对于 30% 的评测用例,n ≤ 5 × 10^6 ;
对于 70% 的评测用例,n ≤ 10^9 ;
对于所有评测用例,1 ≤ n ≤ 10^18 。


解析

莫比乌斯函数绝对值求和
过了83%


参考程序

#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
 
vector<int> isprime;
vector<int> primes;
vector<int> mu;
 
void sieve(int N) {
    isprime.assign(N + 1, 1);
    mu.assign(N + 1, 0);
    
    mu[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (isprime[i]) {
            primes.push_back(i);
            mu[i] = -1;
        }
        for (auto p : primes) {
            if (i * p > N) {
                break;
            }
            isprime[i * p] = 0;
            if (i % p == 0) {
                break;
            }
            mu[i * p] = -mu[i];
        }
    }
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    i64 n;
    cin >> n;
 
    int N = sqrt(n);
    sieve(N);
 
    i64 ans = 0;
    for (int i = 1; i <= N; i++) {
        ans += 1LL * mu[i] * (n / (1LL * i * i));
    }
    cout << ans << '\n';
 
    return 0;
}

以个人刷题整理为目的,如若侵权,请联系删除~

你可能感兴趣的:(蓝桥杯,蓝桥杯,c语言,c++)