10.6比賽 T2
阿新 • • 發佈:2017-10-06
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);View Code13 //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 }
10.6比賽 T2