zoukankan      html  css  js  c++  java
  • 素因子分解

    题意:将A(n , m)转化成k进制后末尾0的个数。

    分析:
    求A(n, m)转化成k进制以后末尾0的个数。对k素因子分解,第i个因子为fac[i],
    第i个因子的指数为num[i],然后再对n的对A(n, m)进行素因子分解,设count[i]
    代表fac[i]对应的指数,ans = min{count[i]/num[i] } 
     

    题:寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行。

    假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫数量太过庞大了,而寒假的天数太少,所以lzx在寒假里不会与一个MM约会一次以上。现在lzx想要知道:寒假安排的方案数如果写成k进制,末位会有多少个0。

    Input

    输入的第一行是一个整数,为数据的组数t(t<=1000)。

    每组数据占一行,为3个正整数n、m和k(1<=m<=n<2^31,2<=k<2^31),意思如上文所述。

    Output

    对于每组数据,输出一个数,为寒假安排的方案数写成k进制末位的0的数目。

    Sample Input

    3
    10 5 10
    10 1 2
    10 2 8

    Sample Output

    1
    1
    0

    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    using namespace std;
    const int N=1e5+5;

    bool prime[N];
    int p[N];
    int k;

    int cnt;
    int fac[N];
    int num[N];

    long long sum[N];

    void isprime()            //素数快篩
    {
       long long i,j;
       k=0;
       memset(prime,true,sizeof(prime));
       for(i=2;i<N;i++)
       {
           if(prime[i])
           {
               p[k++]=i;
               for(j=i*i;j<N;j+=i)
               prime[j]=false;
           }
       }
    }

    void fenjie(int n)                //素因子分解,将一个数拆为素因子的乘积
    {
        cnt=0;
        memset(num,0,sizeof(num));
        for(int i=0;p[i]*p[i]<=n&&i<k;i++)
        {
            if(n%p[i]==0)
            {
                fac[cnt]=p[i];
                while(n%p[i]==0)
                {
                    num[cnt]++;
                    n=n/p[i];
                }
                cnt++;
            }
        }
        if(n>1)
        {
            fac[cnt]=n;
            num[cnt++]=1;
        }
    }

    int getnum(int n,int p)                     //计算n的阶乘中素因子p的指数
    {
        int sum=0;
        while(n>=p)
        {
            sum+=n/p;
            n=n/p;
        }
        return sum;
    }

    int main()
    {
        int i,t,n,m,x;
        long long ans;
        isprime();
        cin>>t;
        while(t--)
        {
            ans=1000000000;
            scanf("%d%d%d",&n,&m,&x);
            fenjie(x);
            for(i=0;i<cnt;i++)
            {
                sum[i]=getnum(n,fac[i])-getnum(n-m,fac[i]);      
                ans=min(sum[i]/num[i],ans);
            }
            printf("%lld ",ans);
        }
        return 0;
    }

  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/chen9510/p/4694571.html
Copyright © 2011-2022 走看看