時間限制:?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");}
}