zoukankan      html  css  js  c++  java
  • Again Prime? No Time. UVA

    m^k就是让m的每个质因子个数都增加了k倍

    求m的质因子 在n!中增加了多少倍就好了,因为m^k 表示每一个质因子增加相同的倍数k  所以我们需要找到增加倍数最小的那个。。短板效应  其它质因子多增加的倍数都合并一下 就是n!的另一个因数了

     其他的乘到一起 就是N了。。。

    因为n!的很大。。但n!是从1到n的乘积 所以从1到n的这些数所包含的质因子PPP3 ```Pc  个数的和就是 n!中对应质因子的个数。。

    我这种蒟蒻就只适合做模板图论。。。。

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 1001000, INF = 0x7fffffff;
    
    LL primes[maxn], vis[maxn];
    int base1[maxn], mi1[maxn], mi2[maxn];
    int n, m;
    int ans = 0;
    
    void init()
    {
        mem(vis, 0);
        for(int i=2; i<maxn; i++)
            if(!vis[i])
            {
                primes[ans++] = i;
                for(LL j=(LL)i*i; j<maxn; j+=i)
                    vis[j] = 1;
            }
    }
    
    int main()
    {
        int T, kase = 0;
        init();
        cin>> T;
        while(T--)
        {
            mem(base1, 0);
            mem(mi1, 0);
            mem(mi2, 0);
            int res;
            cin>> m >> n;
            int cnt = 0;
    
            for(int i=0; i<ans && primes[i] * primes[i] <= m; i++)
            {
                int cnt2 = 0;
                while(m % primes[i] == 0)
                {
                    m /= primes[i];
                    cnt2++;
                }
                if(cnt2 > 0)
                {
                    base1[cnt++] = primes[i];
                    mi2[primes[i]] += cnt2;
                }
            }
            if(m > 1)
            {
                base1[cnt++] = m;
                mi2[m] += 1;
            }
    
            for(int j=1; j<=n; j++)
            {
                res = j;
    
                for(int i=0; i<cnt; i++)
                {
                    
                    int cnt2 = 0;
                    while(res % base1[i] == 0)
                    {
                        res /= base1[i];
                        cnt2++;
                    }
                    if(cnt2 > 0)
                    {
    
                        mi1[base1[i]] += cnt2;
                    }
                }
            }
    
    
            int minn = INF;
            for(int i=0; i<cnt; i++)
            {
                minn = min(minn, mi1[base1[i]]/mi2[base1[i]]);
            }
            printf("Case %d:
    ",++kase);
            if(minn)
                cout<< minn <<endl;
            else
                cout<< "Impossible to divide" <<endl;
        }
        return 0;
    
    }

     

    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    AJax 源码思路
    C语言博客作业--字符数组
    C语言博客作业--一二维数组
    C语言博客作业--数据类型
    C语言博客作业--函数
    C语言博客作业--嵌套循环
    C语言第三次博客作业---单层循环结构
    C语言第二次博客作业---分支结构
    C语言第一次博客作业——输入输出格式
    C语言博客作业--数据类型
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9317753.html
Copyright © 2011-2022 走看看