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 }
View Code
原文地址:https://www.cnblogs.com/fenghhh/p/7631763.html