1. 程式人生 > >10.6比賽 T2

10.6比賽 T2

pre 完成 math 當前 names 的人 logs str main

紡織(textile)
【題目描述】
機戶出資,機工出力,這是種花家早期資本主義萌芽的出現。
小 C 有 n 個機工, 小 C 可以安排他們分成若幹個組來進行紡織。
當然,如果一個組的人數越多,那麽分配給這個組的任務的難度也就
越大。具體來說,就是如果一個組裏有 x 個人,那麽分配給他們的任
務需要他們用 x 天來完成。為了賺取更多資本,小 C 給機工們下了
一條命令,一組機工完成當前任務後,如果發現其他機工中 只要還有
一組正在工作,那麽這組機工必須 立刻 再次開始他們的任務,否則他
們就可以休息了。 所有機工最初都是同時開始工作的, 從他們同時開
始工作的那一刻到所有人都休息的那一刻稱為總工作時間。小 C 發
現,分組的情況不同,總工作時間也會有所不同,他想知道,最多可
以產生多少種不同的總工作時間?
【輸入數據】
輸入只有一行一個正整數 n,表示機工的人數。
【輸出數據】
輸出一個整數,表示不同的總工作時間數。
【樣例輸入】
3
【樣例輸出】
3
【數據範圍】
對於 10%的數據,n<=10;
對於 30%的數據,n<=100;
對於 50%的數據,n<=300;
對於 100%的數據,n<=1000。
【樣例解釋】
有 3 種本質不同的分組方式:
① 分 3 組,每組 1 人,總工作時間為 1。
② 分 2 組,一組 1 人,另一組 2 人,總工作時間為 2。
③ 分 1 組,這一組 3 人,總工作時間為 3。
所以不同的總工作時間數為 3。

思路:

就是將n分成幾個大等於一的數,然後算出不同的最大公倍數的個數

代碼:

技術分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 using namespace std;
 6 bool x[1001];
 7 int n,a[1001],h;
 8 long long b[1001],daan;
 9 int main()
10 {
11     int i,j,g;
12     //freopen("textile.in","r",stdin);
13 //freopen("textile.out","w",stdout); 14 cin>>n; 15 for(i=2;i<=n;i++) 16 { 17 if(!x[i]) 18 { 19 h++; 20 a[h]=i; 21 } 22 for(j=1;i*a[j]<=n;j++) 23 { 24 x[i*a[j]]=true; 25 if(i%a[j]==0) 26
{ 27 break; 28 } 29 } 30 } 31 b[0]=1; 32 for(i=1;i<=h;i++) 33 { 34 for(j=n;j>=a[i];j--) 35 { 36 37 for(g=a[i];g<=j;g*=a[i]) 38 { 39 b[j]+=b[j-g]; 40 } 41 } 42 } 43 for(i=0;i<=n;i++) 44 { 45 daan+=b[i]; 46 } 47 cout<<daan; 48 return 0; 49 }
View Code

10.6比賽 T2