时间限制: 1 s 空间限制: 256 MB
题目描述
Jimmy 开始学习除法啦!一开始他学习了余数为 0 的除法(也就是我们常说的整除),后来又学习了余数不为 0 的除法,所以 Jimmy 对被除数、除数、商、余数这些概念都已经了如指掌了。
有一天,他忽然思考起一个问题——给一个正整数 n 作为被除数,除数 k 可以取任意正整数,那么会有多少互不相同的商呢?
例如:被除数 n=5,无论除数 k 如何变化,商最多也只有 4 个不同的值,分别为 0,1,2,5。这是因为:
- 5÷6=0…5
- 5÷5=1…0
- 5÷4=1…1
- 5÷3=1…2
- 5÷2=2…1
- 5÷1=5…0
Jimmy 作为一个天才,对这么简单的问题自然是手到擒来,于是他拿着这个问题向你发起了挑战。你能回答这个问题吗?
输入
本题输入有多组测试数据。
第一行一个整数 T,表示测试数据的组数。
接下来 T 行,每行一个整数 n,表示被除数。
输出
输出共 2×T 行,对于每组测试数据输出 2 行:
第一行输出一个整数 m,表示商有 m 个不同的值;
第二行输出 m 个整数,分别表示 m 个不同的商,按从小到大的顺序输出。
样例数据
输入
2 5 11
输出
4 0 1 2 5 6 0 1 2 3 5 11
数据范围限制
对于 50% 的数据,保证 1≤n≤10^5。
对于 100% 的数据,保证 1≤T≤10,1≤n≤10^9。
思路
相信很多同学在看到这题时会一脸懵逼😦
因为数据范围实在是太大了😱😱😱
其实我跟你们一样,嘻嘻嘻😁
事实上只需要枚举到sqrt(n)就行了。
跟判断素数的方法差不多。
代码
#include <bits/stdc++.h>
using namespace std;
int a[1000001];
int main()
{int t,n;cin>>t;for(int i=1;i<=t;i++){int z=0;cin>>n;a[++z]=0;for(int j=1;j*j<=n;j++){if(n/j==j){a[++z]=j;}else{a[++z]=j;a[++z]=n/j;}}sort(a+1,a+1+z);printf("%d\n",z);for(int j=1;j<=z;j++) printf("%d ",a[j]);printf("\n");}
}