m^k就是让m的每个质因子个数都增加了k倍
求m的质因子 在n!中增加了多少倍就好了,因为m^k 表示每一个质因子增加相同的倍数k 所以我们需要找到增加倍数最小的那个。。短板效应 其它质因子多增加的倍数都合并一下 就是n!的另一个因数了
其他的乘到一起 就是N了。。。
因为n!的很大。。但n!是从1到n的乘积 所以从1到n的这些数所包含的质因子P1 P2 P3 ```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:\n",++kase); if(minn) cout<< minn <<endl; else cout<< "Impossible to divide" <<endl; } return 0; }