3535 - 切蛋糕
时间限制 : 1 秒
内存限制 : 128 MB
你有一块非常长且薄的蛋糕。我们可以认为它是一维的,长度为n。
今天是你的生日,你有不少朋友要来你的寝室开party。
在你朋友到来前,你想要把蛋糕切好成若干块。
当你的朋友到来时,你会用以下规则来分配蛋糕。
从蛋糕的左端开始,你给你的第一位朋友若干块连续的蛋糕,接下来你给第二位朋友之后的若干块连续的蛋糕,以此类推。
你显然被朋友认为是一个非常nice的人,也就是你必须保证每个人分到的蛋糕量是相同的。
不同的朋友拿到的蛋糕块数可能不同,但量必须相同。
你已经不记得你邀请了多少位朋友,但你非常清楚地记得,朋友的个数x是一个蛋糕长度n的因子,且x<n。
现在,你要开始切蛋糕了,你必须保证,对于任何可能的朋友个数x,按照以上的蛋糕分配法则,都是可以做到每个人拿到的蛋糕量相同。
请计算,你最少需要把蛋糕切成多少块,来达到以上要求。
<br />
下面解释第一组样例数据。
由于蛋糕长度为6。所以朋友个数x可能为1个,2个或者3个。我们可以将蛋糕切成2,1,1,2,这样的4份。
如果只有1个朋友,直接全部给他。
如果有2个朋友,我们将第一块和第二块给第一个朋友,第三块和第四块给第二个朋友。
如果有3个朋友,我们将第一块给第一个朋友,第二和第三块给第二个朋友,第四块给第三个朋友。
以上的切法是最少的。
所以答案为4。
题目输入
多组输入数据
每组数据第一个数为n
表示蛋糕的长度(2<=n<=123456)
<br />
题目输出
对于每组数据,输出你最少需要把蛋糕切成多少块。
输入/输出样例
输入格式
6 3 15
输出格式
4 1 7
C++解答
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <sstream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <numeric> #include <cassert> #include <complex> #include <ctime> #define clr(x,a) memset(x,a,sizeof(x)) #define sz(x) (int)x.size() #define rep(i,n) for(int i=0;i<n;i++) #define repeat(i, a, b) for(int i=(a);i<=(b);i++) #define all(v) (v).begin(), (v).end() #define Unique(store) store.resize(unique(store.begin(),store.end())-store.begin()) #define X first #define Y second using namespace std; const int N=123456+10; bool cnt[N]; int cut(int n) { vector<int> div; memset(cnt,0,sizeof(cnt)); for (int i=2; i<n; i++) { if (n%i==0) { div.push_back(n/i); } } for (int i=0; i<div.size(); i++) { int cur=div[i]; for (int i=cur; i<=n; i+=cur) { cnt[i]=true; } } int ret=0; for (int i=1; i<=n; i++) { ret+=cnt[i]; } return max(ret,1); } int main () { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); //srand(time(NULL)); int n; while (scanf("%d",&n)!=EOF) { cout<<cut(n)<<endl; } return 0; }