Codeforces Good Bye 2018 C

题目连接:https://codeforces.com/contest/1091/problem/C
对于一个\(k\)会被覆盖到的人是编号\(i\)要满足
\[gcd(k,n) \mid i\]
所以可以枚举\(gcd(k,n)\)并算出\(gcd(k,n)\)\(n\)以内的倍数和。
时间复杂度\(O(\sqrt n)\),空间复杂度\(O(\sqrt n)\)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <iomanip>

using namespace std;

long long n;

vector<long long> ans;

int main()
{
    cin >> n;
    for (long long i = 1;i * i <= n;i++)
        if (n % i == 0)
        {
            ans.push_back((n + 2 - i) * (n / i) / 2);
            if (i != n / i)
                ans.push_back((n + 2 - (n / i)) * (n / (n / i)) / 2);
        }
    sort(ans.begin(),ans.end());
    for (int i = 0;i < ans.size();i++)
        cout << ans[i] << ' ';
    cout << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Hazyknight/p/10232898.html