1 条题解

  • 1
    @ 2023-11-21 10:07:43

    题目要求我们用质因子分解式来表达某数,因此我们需要对非质数做处理,本题坑点可能是我们直接想用两个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
    上传者