1. 程式人生 > >Codeforces Good Bye 2018 C

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;
}