水题(water)

题目描述

链接:https://ac.nowcoder.com/acm/contest/5203/E来源:牛客网

img

其中,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;
}
posted @ 2020-05-07 16:00  0x4f  阅读(339)  评论(0编辑  收藏  举报