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は与えられたために、可能なすべての評価単位のシーケンスを見つけ、プログラムを書きます。
入力
入力のテストケースの数 - 最初の行は数t(1≤t≤10)整数含ま。そして、t検定の例は以下の通り。
各ラインは、整数n(1≤n≤109)が含ま - 評価単位の総数が描かれています。
出力
出力t検定の例それぞれの答え。それぞれの答えは二行に含まれるべきです。
Vasyaを得ることができること、異なる評価インクリメント値の数 - 最初の行では、単一の整数mを印刷します。
可能評価増分の値 - 昇順で次の行の印刷Mの整数です。
例
入力
4
5
11
1
3
出力
4
0 1 2 3 5
6
0 1 2 3 5 11
2
0 1
3
0 1 3
問題の意味
n個のドルの合計k個の個体は[N / K]ドル、切り捨て。
あなたが与えられたn個のドルは、あなたは多くの人々が、それぞれの人物の出力は多くのお金を得ることができる方法がわかりません
問題の解決策
問題の動画を解決https://www.bilibili.com/video/av77514280/
kの数の増加に伴い、お金の数は確かに低下している、そして私たちは、各区間のための2つの秋を分離することができ、その後、出力は答えることができるようになります
コード
#include<bits/stdc++.h>
using namespace std;
long long n;
void solve(){
vector<long long>Ans;
cin>>n;
int x = 1;
Ans.push_back(n);
while(x<=n){
long long l = x,r = n+1,ans=l;
long long d = n/l;
while(l<=r){
long long mid=(l+r)/2;
if(n/mid==d){
l=mid+1;
ans=mid;
}else{
r=mid-1;
}
}
Ans.push_back(n/(ans+1));
x=ans+1;
}
sort(Ans.begin(),Ans.end());
Ans.erase(unique(Ans.begin(),Ans.end()),Ans.end());
cout<<Ans.size()<<endl;
for(int i=0;i<Ans.size();i++){
cout<<Ans[i]<<" ";
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}