Codeforces Round #603 (Div. 2) C. Everyone is a Winner!(数论)

题目链接:https://codeforces.com/contest/1263/problem/C

题意

给出一个数字 $n$,问 $n$ 有多少个不同的下取整。

题解

举个例子,比如 11 有 6 个下取整:

$\lfloor \frac{11}{1} \rfloor = 11$

$\lfloor \frac{11}{2} \rfloor = 5$

$\lfloor \frac{11}{3} \rfloor = 3$

$\lfloor \frac{11}{4} \rfloor = \lfloor \frac{11}{5} \rfloor = 2$

$\lfloor \frac{11}{6} \rfloor = \lfloor \frac{11}{7} \rfloor = \lfloor \frac{11}{\dots} \rfloor = \lfloor \frac{11}{11} \rfloor = 1$

$\lfloor \frac{11}{12} \rfloor = \lfloor \frac{11}{13} \rfloor = \lfloor \frac{11}{\dots} \rfloor = 0$

注意到,$\lfloor \frac{11}{6} \rfloor = 1$,$\frac{11}{1} = 11$,所以每次可以由当前下整得到可以得到当前下整的最大数,即 $\frac{n}{\lfloor \frac{n}{i} \rfloor}$ 。

代码

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n; cin >> n;
    map<int, bool> mp;
    for (int i = 1; i <= n; i = n / (n / i) + 1)
        mp[n / i] = true;
    mp[0] = true;
    cout << mp.size() << "\n";
    for (auto i : mp) cout << i.first << ' ';
    cout << "\n";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

 

posted @ 2020-06-30 23:30  Kanoon  阅读(114)  评论(0)    收藏  举报