题目描述
链接:https://ac.nowcoder.com/acm/contest/5203/E来源:牛客网
其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其互不攻击的方案数。
输入描述:
输入数据共一行,两个正整数x,m,意义如“题目描述”。
输出描述:
一个正整数k,表示输出结尾0 的个数或者放置皇后的方案数
示例1
输入
[复制]
375 16
输出
[复制]
14200
说明
鸣谢真·dalao Tyxao
思路:
(一道套娃题
首先这个公式,大表可以发现是一个斐波那契数列,先打表判断判断x是否存在数列中。
如果存在,需要求(x!)在(m)进制下末尾0的数量,我们知道求(x!)在10进制下末尾0的数量就是统计n!下2和5因子的个数,这个数量的min就是末尾0的个数,因为(2^1*5^1=10)是10的分解质因子得到的。先对m分解质因子,再对x的阶乘分解质因子求这些质因子的个数,最后统计这些因子可以凑出来最多几个m,就是答案。
如果不存在跑一个z皇后,z≤13。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL f[90];
map<LL,bool> mmp;
int fac[110],s[110],z,ans;
int st[20],pos[20];
void dfs(int u){
if(u==z) {
ans++;
return ;
}
for(int i=0;i<z;++i){
pos[u]=i;
bool flag=1;
for(int j=0;j<u;++j){
if(pos[j]==i||i-u==pos[j]-j||i+u==pos[j]+j){
flag=0;
}
}
if(flag){
dfs(u+1);
}
}
}
int main(){
f[1]=1,f[2]=1;
for(int i=3;i<90;++i){
f[i]=f[i-1]+f[i-2];
mmp[f[i]]=1;
}
LL x,m;
cin>>x>>m;
if(mmp[x]){
int cnt=0;
for(int i=2;i<=m/i;++i){
if(m%i==0){
fac[++cnt]=i;
while(m%i==0){
s[cnt]++;
m/=i;
}
}
}
if(m>1) fac[++cnt]=m,s[cnt]=1;
LL ans=2e18;
for(int i=1;i<=cnt;++i){
LL ss=0,tx=x;
while(tx){
ss+=tx/fac[i];
tx/=fac[i];
}
ans=min(ans,ss/s[i]);
}
cout<<ans<<endl;
}
else {
z=x%min(13LL,m)+1;
dfs(0);
cout<<ans<<endl;
}
return 0;
}