zoukankan      html  css  js  c++  java
  • uva10780(分解质因数)

    可以直接用高精度来暴力求。

    也可以不用高精度:

    把m分解质因数,记录每个因数和它的次数。然后计算每个因数在n的阶乘里出现了多少次,再把这个次数除以它在m中的次数,就是可能的k值。取最小的k。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<set>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<queue>
    using namespace std;
    #define INF 1000000000
    #define eps 1e-8
    #define pii pair<int,int>
    #define LL long long int
    int m,n,k,T;
    int prime[5005],vis[5005];
    void getprime()
    {
        int num=0;
        for(int i=2;i<5000;i++)
        {
            if(vis[i]==0) prime[num++]=i;
            for(int j=i*i;j<5000;j+=i)
            {
                if(j%i==0) vis[j]=1;
            }
        }
    }
    int main()
    {
        //freopen("in6.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        getprime();
        scanf("%d",&T);
        for(int cas=1;cas<=T;cas++)
        {
            scanf("%d%d",&m,&n);
            k=INF;
            vector<pii>zhi;
            for(int i=0;prime[i]<=m;i++)
            {
                int num=0;
                while(m%prime[i]==0)
                {
                    num++;
                    m/=prime[i];
                }
                if(num)
                zhi.push_back(make_pair(prime[i],num));
            }
            for(unsigned int i=0;i<zhi.size();i++)
            {
                int t=zhi[i].first,num=0;
                for(int j=n;j>=1;j--)
                {
                    int jj=j;
                    while(jj%t==0)
                    {
                        num++;
                        jj/=t;
                    }
                }
                //cout<<'k'<<num<<endl;
                k=min(k,num/(zhi[i].second));
            }
            printf("Case %d:
    ",cas);
            if(k)
            printf("%d
    ",k);
            else
                printf("Impossible to divide
    ");
        }
        //fclose(stdin);
        //fclose(stdout);
        return 0;
    }
  • 相关阅读:
    两个单链表的第一个公共节点
    对于混沌定义中三个条件的理解
    sort()函数使用详解
    C++优先队列详解
    第一次只出现一个的字符
    丑数
    把数组排成最小的数
    从1到n整数中1的个数
    git相关知识
    文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
  • 原文地址:https://www.cnblogs.com/zywscq/p/3945724.html
Copyright © 2011-2022 走看看