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

浙公网安备 33010602011771号