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;

}

 

自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/9317753.html