1 条题解
-
0
题解:
其中 p 为素数,e 为指数,
将 e 拆分为 k 个数的和,使得 不同的个数最多。
比如:168=23×31×71
23中的幂次 3=1+2 可以分解 2 次
31中的幂次 1 可以分解 1 次
71中的幂次 1 可以分解 1 次
总的可以分解 2+1+1=4 次
算法步骤:
1、从 枚举能整除 N 的素数 i,并计算 i 能整除 N 几次,求出 i 的指数大小 cnt。
2、用函数 solve()计算 cnt 能分成的次数 res 比如:
cnt=3 可以分成 2 次乘积,即 i3 =i1×i2,于是 i 的 res=2。
3、对枚举的、所有 i 的 res 求和即为答案。
注意细节:N 被所有符合条件的素数整除后,可能结果不为 1,此时答案 ans++,需要特判一下。
#include<bits/stdc++.h> using namespace std; typedef long long ll; int solve(int e) { int now=1,res=0; while(now<=e) { e-=now; now++; res++; } return res; } int main() { ll n; int ans=0; cin>>n; ll m=sqrt(n); for(ll i=2;i<=m;i++) { if(n%i==0) { int cnt=0; while(n%i==0) { n=n/i; cnt++; } ans=ans+solve(cnt); } } if(n!=1) ans++; cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 222
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 164
- 已通过
- 17
- 上传者