时间限制: 1000 ms 空间限制: 131072 KB
题目描述
给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0=1,X1,X2,。。。,Xm=X满足:Xi<Xi+1同时Xi**|**Xi+1(Xi+1能被Xi整除)
要求X-因子链的最大长度Len和长度为Len的X-因子链的数量。
输入
一个正整数X(X <231)
输出
一行,两个整数,分别表示最大长度和该长度链的种数。
样例输入
样例输出
数据范围限制
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; const int maxp = 10000 + 5; const int maxn = 1100000 + 5; int sum,X; int prime[maxp]; bool vis[maxn]; int num[maxp],k; void init(){ sum=0; memset(vis,true,sizeof(vis)); for(int i=2;i<=maxn;i++){ if(!vis[i]) continue; prime[sum++]=i; if(i>(int)sqrt(maxn)) continue; for(int j=i*i;j<=maxn;j+=i) vis[j]=false; } } ll get_max(){ ll ans=0; for(int i=0;i<k;i++) ans+=(ll)num[i]; return ans; } ll get_sum(){ ll fenzi=1; ll Max=get_max(); for(ll i=2;i<=Max;i++) fenzi*=i; for(int i=0;i<k;i++){ for(int j=2;j<=num[i];j++){ fenzi/=(ll)j; } } return fenzi; } void solve(){ k=0; memset(num,0,sizeof(num)); for(int i=0;i<sum;i++){ if(X%prime[i]==0){ while(X%prime[i]==0){ num[k]++; X/=prime[i]; } k++; } if(X==1){ break; } } ll ans_max=get_max(); ll ans_sum=get_sum(); printf("%lld %lld\n",ans_max,ans_sum); } int main(){ freopen("factor.in","r",stdin); freopen("factor.out","w",stdout); init(); while(scanf("%d",&X)!=EOF){ solve(); }return 0; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系