题意:给定n,问n的整除答案有多少种并一一输出。(⌊N/i⌋的不同取值个数,输出)
数论分块裸题
如果 ⌊N/i′⌋ 与 ⌊N/i⌋ 相等,那么i‘的最大值为⌊N/⌊N/i⌋⌋
所以设置两个指针 l 、r。l 初始值为1,每次r=⌊N/⌊N/i⌋⌋,r-l+1就是每种答案的个数,n/r就是每个不同的答案
int a[maxn];
int main(){
int t,n;
cin>>t;
while(t--){
/*for(int i=1;i<=100;i++){
cout<<0<<" ";
for(int j=i+1;j>=1;j--){
if((i/j)!=(i/(j+1)))
cout<<i/j<<" ";
}
cout<<" ("<<i<<") "<<endl;
}*/ //暴力观察
cin>>n;
int ans=0;
a[ans]=0;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans++;
//cout<<ans<<" "<<l<<" "<<r<<endl;
a[ans]=n/r;
}
cout<<ans+1<<endl;
sort(a,a+ans+1);
for(int i=0;i<=ans;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}