10.6比赛 T2
纺织(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 }