リンク:
https://codeforces.com/contest/1263/problem/C
質問の意味:
よく知られている試験システムMathForcesに、n個の評価ユニットの延伸が配置されています。評価は、以下のアルゴリズムに従って分配される:K参加者がこのイベントに参加する場合、n個の評価が均等にそれらの間に分布し、最も近い低い整数に丸め、描画の終了時に、未評価のままでもよいれます - それは、参加者のいずれにも与えられていません。
例えば、N = 5、K = 3は、各参加者は1件の評価ユニットを受け取るであろう、また、2つの評価ユニットは、未使用のままになります。N = 5、かつk = 6場合は、参加者のいずれもが彼らの評価を増加します。
Vasyaは、この評価抽選に参加したが、このイベントの参加者の合計数についての情報を持っていません。そのため、彼は評価増分の異なる値がこの抽選の結果として得ることが可能であるかを知りたい、助けをお願いします。
例えば、N = 5は、次に答えは配列0,1,2,5に等しい場合。0 =⌊5/7⌋、1 =⌊5:配列値(及びそれらのみ)のそれぞれは⌊n/k⌋(⌊x⌋は、xの値は切り捨て)いくつかの正の整数kのようにして得ることができます/5⌋、2 =⌊5/2⌋、5 =⌊5/1⌋。
nは与えられたために、可能なすべての評価単位のシーケンスを見つけ、プログラムを書きます。
アイデア:
あなたは、n / SCO SCOは数に対応している、部分的列挙を取得することができます。その後、N /番号、ポイントの現在の最大数を取得します。
N /(N / NUM)丸め
コード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int sco = 1;
vector<int> res;
res.push_back(0);
while(sco <= n)
{
int num = n/sco;
sco = n/num;
res.push_back(sco);
sco++;
}
cout << (int)res.size() << endl;
for (auto v: res)
cout << v << ' ' ;
cout << endl;
}
return 0;
}