1. 程式人生 > WINDOWS開發 >Codeforces Round #603 C. Everyone is a Winner!

Codeforces Round #603 C. Everyone is a Winner!

技術分享圖片

題意:你一個整數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>
12
#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 24
int 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 }
View Code