周赛Problem 1021: 分蛋糕(埃拉托斯特尼筛法)

时间:2024-08-17 10:34:26

Problem 1021: 分蛋糕

Time Limits:  1000 MS   Memory Limits:  65536 KB

64-bit interger IO format:  %lld   Java class name:  Main

Description

今天欧文出新品,筱丽学姐请实验室大家吃蛋糕体积为m,mm,m为整数,她将蛋糕平分成了mm块,每块体积为11,但她要求每个人吃nknk块,每种情况下nn相同,且相同的kk的个数小于nn,n≠1,k≠0n≠1,k≠0,即可以从mm中挑出几块组成nknk;每个人吃的块数可以相同,如果不能恰好吃完,那她将独吞所有蛋糕;问共有几种分法能让大家吃到蛋糕;

Input

蛋糕的体积m,2≤m≤1012m,2≤m≤1012;

Output

有几种分法

Sample Input

6
2

Output for Sample Input

3
1

Hint

m=6, 共三种 {21,22},{31,31},{61};

经过同学和学姐的指点才做出来。

思路:题意情况下方案数可以先将输入的n分解为素数乘积的形式,然后将每一位的指数+1,然后累乘指数得到r,答案就是r-1。

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
void finder(LL n)
{
LL a=2,i=0,r=1;
while(a*a<=n)
{
i=0;
while(n%a==0)
{
n=n/a;
i++;
}
r=r*(i+1);
a++;
}
if(n>1)
r*=2;
printf("%lld\n",r-1);
}
int main(void)
{
LL n;
while (~scanf("%lld",&n))
{
finder(n);
}
return 0;
}