链接:https://www.nowcoder.com/acm/contest/135/C
来源:牛客网
输入数据共一行,两个正整数x,m,意义如“题目描述”。
一个正整数k,表示输出结尾0 的个数或者放置皇后的方案数
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e6+10; const double eps = 1e-8; const ll mod = 1e9 + 7; const int inf = 0x3f3f3f3f; const double pi = acos(-1.0); ll f[100]={-1,1,0,0,2,10,4,40,92,352,724,2680,14200,73712,365596}; ll prime[] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}; ll getcnt( ll p, ll x ) { ll res = 0; while(x) { res += x/p; x /= p; } return res; } int main() { ios::sync_with_stdio(0); ll a[105]; a[1] = 1, a[2] = 1; for( ll i = 3; i <= 92; i ++ ) { a[i] = a[i-1] + a[i-2]; } ll x, m; cin >> x >> m; bool flag = false; for( ll i = 1; i <= 92; i ++ ) { if( a[i] == x ) { flag = true; break; } } if( flag ) { map<ll,ll> mp; vector<pair<ll,ll> > e; for( ll i = 1; i <= 25; i ++ ) { while(m%prime[i]==0) { //m中有多个相同的质数 mp[prime[i]] ++; m /= prime[i]; } } for( auto i : mp ) { e.push_back(make_pair(i.second,getcnt(i.first,x))); } ll k = 1e18+1; for( ll i = 0; i < e.size(); i ++ ) { k = min(k,e[i].second/e[i].first); //因为质数可能有多个,所以求的质数还要除以质数的个数 } cout << k << endl; } else { cout << f[x%min((ll)13,m+1)+1] << endl; } return 0; }
原文:https://www.cnblogs.com/l609929321/p/9529395.html