zoukankan      html  css  js  c++  java
  • poj 2649 Factovisors 对n!进行因数分解

    Factovisors
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 4431   Accepted: 1086

    Description

    The factorial function, n! is defined thus for n a non-negative integer: 
       0! = 1
    
    n! = n * (n-1)! (n > 0)

    We say that a divides b if there exists an integer k such that 
       k*a = b


    Input

    The input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31.

    Output

    For each input line, output a line stating whether or not m divides n!, in the format shown below.

    Sample Input

    6 9
    6 27
    20 10000
    20 100000
    1000 1009
    

    Sample Output

    9 divides 6!
    27 does not divide 6!
    10000 divides 20!
    100000 does not divide 20!
    1009 does not divide 1000!
    

    Source

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int MAXN=50000;
    bool vis[MAXN+10];
    int prime[MAXN+10];
    int n,m,p;
    vector<pair<int,int> > exp;
    
    void init()//素数筛选
    {
        memset(vis,0,sizeof(vis));
        p=0;
        for(int i=2; i<=MAXN; ++i)
        {
            if(vis[i]==false)
                prime[p++]=i;
            for(int j=0; j<p&&i*prime[j]<=MAXN; ++j)
                vis[i*prime[j]]=true;
        }
    }
    
    bool check(int x,int y)//判断当前的素数,n是否有这么多个
    {
        int tmp=n,sum=0;
        while(tmp)
        {
            sum+=tmp/x;
            tmp/=x;
        }
        return y<=sum;
    }
    
    bool judge()
    {
        for(int i=0; i<exp.size(); ++i)
            if(!check(exp[i].first,exp[i].second))
                return false;
        return true;
    }
    
    int main()
    {
        init();
        while(scanf("%d%d",&n,&m)==2)
        {
            if(m==0)
            {
                printf("%d does not divide %d!
    ",m,n);
                continue;
            }
            exp.clear();
            int t=m;
            for(int i=0; i<p&&prime[i]<=m; ++i)
                if(m%prime[i]==0)
                {
                    int cnt=0;
                    while(m%prime[i]==0)
                    {
                        m/=prime[i];
                        ++cnt;
                    }
                    exp.push_back(make_pair(prime[i],cnt));//m的素数个数与m的素数因子对应
                }
            if(m!=1)
                exp.push_back(make_pair(m,1));
            if(judge())
                printf("%d divides %d!
    ",t,n);
            else
                printf("%d does not divide %d!
    ",t,n);
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    ndarray数据类型
    创建ndarray
    SqlHelper
    插入订单并且输出订单号的sql存储过程
    JQury自动切换图片
    设计模式--责任链模式
    设计模式--模板方法模式
    设计模式--观察者模式
    设计模式--享元模式
    设计模式--组合模式
  • 原文地址:https://www.cnblogs.com/l609929321/p/6776327.html
Copyright © 2011-2022 走看看