zoukankan      html  css  js  c++  java
  • hdu 3758 Factorial Simplification

    这题主要是质因数分解!!

    求出每个因子的幂,如果有负数,则输出-1;

    如果2的幂数为0,这输出0;

    最后就是开始凑阶乘了……

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<algorithm>
      4 #include<iomanip>
      5 #include<cmath>
      6 #include<string>
      7 #include<cstdlib>
      8 #include<vector>
      9 using namespace std;
     10 int prime[1300],cnt,p[1300],q[1300],num[1300],len;
     11 int s[1300],r[1300],a[1300];
     12 bool f[10010];
     13 int min(int a,int b)
     14 {
     15     return a>b?b:a;
     16 }
     17 int max(int a,int b)
     18 {
     19     return a>b?a:b;
     20 }
     21 void init()
     22 {
     23     int i,j;
     24     cnt=0;
     25     for(i=2;i<=10010;i++)
     26     {
     27         if(f[i]==0) prime[cnt++]=i;
     28         for(j=0;j<cnt&&prime[j]*i<=10010;j++)
     29         {
     30             f[i*prime[j]]=1;
     31             if(i%prime[j]==0) break;
     32         }
     33     }
     34 }
     35 int count(int n,int p)//计算n!中p因子的个数
     36 {
     37     int sum=0;
     38     while(n>=p)
     39     {
     40         sum+=(n/=p);
     41     }
     42     return sum;
     43 }
     44 int divs(int n,int m)//分解因子
     45 {
     46     int i,j;
     47     len=0;
     48     memset(num,0,sizeof(num));
     49     for(i=0;i<n;i++)
     50     {
     51         for(j=0;prime[j]<=p[i];j++)
     52             num[j]+=count(p[i],prime[j]);
     53         len=max(len,j);
     54     }
     55     for(i=0;i<m;i++)
     56     {
     57         for(j=0;prime[j]<=q[i];j++)
     58         {
     59             if(j>=len) return -1;
     60             num[j]-=count(q[i],prime[j]);
     61             if(num[j]<0) return -1;
     62         }
     63     }
     64     if(num[0]==0) return 0;
     65     return 1;
     66 }
     67 int main()
     68 {
     69     init();
     70     int i,j,k,ans,n,m,temp,t,cur,mul;
     71     bool flag;
     72     cin>>t;
     73     while(t--)
     74     {
     75         cin>>n>>m;
     76         for(i=0;i<n;i++) cin>>p[i];
     77         for(i=0;i<m;i++) cin>>q[i];
     78         ans=divs(n,m);
     79         if(ans<=0)
     80         {
     81             cout<<ans<<endl;
     82             continue;
     83         }
     84         for(i=0;i<len&&num[i]>0;i++) ;
     85         len=min(len,i);
     86         cur=prime[i]-1;
     87         cnt=0;
     88         while(num[0]>0&&cur>=2)
     89         {
     90             flag=true;
     91             a[0]=count(cur,prime[0]);
     92             if(a[0]>num[0]) flag=false;
     93             else mul=num[0]/a[0];
     94             for(i=1;flag&&i<len&&prime[i]<=cur;i++)
     95             {
     96                 a[i]=count(cur,prime[i]);
     97                 if(a[i]>num[i]) flag=false;
     98                 else mul=min(mul,num[i]/a[i]);
     99             }
    100             if(flag && mul>0)
    101             {
    102                 if(i<len) len=i;
    103                 r[cnt]=cur;
    104                 s[cnt++]=mul;
    105                 for(i=0;i<len;i++)
    106                 {
    107                     num[i]-=(mul*a[i]);
    108                     if(num[i]==0) break;
    109                 }
    110                 if(len>i) len=i,cur=prime[len]-1;
    111                 else cur--;
    112             }
    113             else cur--;
    114         }
    115         cout<<cnt<<endl;
    116         for(i=0;i<cnt;i++)
    117             cout<<r[i]<<' '<<s[i]<<endl;
    118     }
    119     return 0;
    120 }
    View Code
  • 相关阅读:
    C#编程(三)
    C#编程(二)
    C#编程(一)
    【C#高级编程】笔记之核心C#
    unity3d所要知道的基础知识体系大纲,可以对照着学习
    Unity的界面排版: RectTransform
    Unity3d操作的一些技巧知识点和BUG解决方案
    Unity中一键创建常用文件夹
    【Unity技巧】自定义消息框(弹出框)
    【Unity Tips】备忘录(扫盲篇)
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3205381.html
Copyright © 2011-2022 走看看