Codeforces Round #603 C. Everyone is a Winner!
阿新 • • 發佈:2020-04-30
題意:給你一個整數n,求所有n/k的值(k∈{1,2,3...,n,.......}).
題解:最簡單的方法是用列舉1~sqrt(n),把除數和商放進set中,就能直接水過,但後來看其他人的題解了解到了一種新方法:分塊.
1,3,4,5,6,7,8,9,10.
10,1,1.
從k=1開始列舉,我們發現每個n/k的值都會對應一個區間,那麼我們可以利用n/(n/k)來得到這個區間的最右邊,且下次列舉一定是從n/(n/k)+1開始的.
e.g:當k=5時,n/k=2,n/(n/k)=5(值為2的區間最右邊),然後直接k=n/(n/k)+1=6開始,n/k=1,n/(n/k)=10,結束,記得要把0加進去.
程式碼:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <stack> 7 #include <queue> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <unordered_set> 12View Code#include <unordered_map> 13 #define ll long long 14 #define fi first 15 #define se second 16 #define pb push_back 17 #define me memset 18 const int N = 1e6 + 10; 19 const int mod = 1e9 + 7; 20 using namespace std; 21 typedef pair<int,int> PII; 22 typedef pair<long,long> PLL; 23 24int t; 25 int n; 26 vector<int> res; 27 int main() { 28 ios::sync_with_stdio(false); 29 cin>>t; 30 while(t--){ 31 cin>>n; 32 res.clear(); 33 res.pb(0); 34 for(int l=1,r;l<=n;l=r+1){ 35 r=n/(n/l); 36 res.pb(n/l); 37 } 38 sort(res.begin(),res.end()); 39 printf("%d\n",res.size()); 40 for(auto x:res){ 41 printf("%d ",x); 42 } 43 puts(""); 44 } 45 46 return 0; 47 }