1 条题解
-
1
题目要求我们用质因子分解式来表达某数,因此我们需要对非质数做处理,本题坑点可能是我们直接想用两个for循环来寻找非质数的两个质因子,然而对于60此类数我们无法直接寻找两个质因子,但可以将其分解为2,30。再将30分解为15,2。再将15分解为3,5以此方法实现;
#include<stdio.h> long long a[1000001],b[1000001],c[1000001],d[1000001],e[1000001];//e为素筛,a记录该数对应的最小次方数,b记录该数的几次幂 void su() { e[1]=1; e[0]=1; for(int i=2;i<=1e6;i++)//素筛 { for(int j=i+i;j<=1e6;j=j+i) { e[j]=1; } } for(int i=2;i<=1e3;i++) //寻找数组a,b的对应值 { int sum=0; for(int j=i;j<=1e6;j=j*i) { sum++; if(j==i) continue; if(a[j]==0) { a[j]=i; } if(b[j]==0) { b[j]=sum; } } } } int main() { su(); int t; scanf("%d",&t); int flag=1; for(int i=t;i>=2;i--)//按要求赋值 { c[i]=i; d[i]=flag++; } for(int i=t;i>=2;i--) { if(d[i]!=0&&a[i]!=0&&a[i]!=i)//转化 { d[a[i]]+=b[i]*d[i]; d[i]=0; } if(e[i]==1&&d[i]!=0)//对非素数进行转换 { for(int j=2;j<=i;j++) { if(e[j]==1) continue; if(i%j==0) { d[j]+=d[i]; d[i/j]+=d[i]; d[i]=0; break; } } } } flag=t; for(int i=t+1;i>=2;i--) { if(d[i]==0&&d[i-1]!=0) { flag=i; break; } } printf("f(%d)=",t);//输出 for(int i=2;i<flag;i++) { if(d[i]!=0&&i<flag-1) { printf("%lld^%lld*",c[i],d[i]); } else if(i+1==flag) { if(d[i]>=2) { printf("%lld^%lld",c[i],d[i]); } else if(d[i]==1) printf("%lld",c[i]); } } }
- 1
信息
- ID
- 942
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 73
- 已通过
- 8
- 上传者