题意:

图片说明

其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其互不攻击的方案数。


题解:

打表后可以发现F函数为斐波那契数列,所以问题就变成如何去求x!在m进制下末尾0的个数和Z皇后的个数
由于Z<=14 所以说这一部分直接打表即可
考虑如何求x!在m进制下末尾0的个数
将x!能表示为 图片说明 显然图片说明 即为所求
图片说明
所以将m分解后,求k1,k2,k3,各个系数在x!中出现的次数最小值即为答案
那么令图片说明 表示x!有多少个p的因子
所以图片说明
递归求解即可


代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
#define pb push_back
#define fi first
#define se second
#define yes puts("YES")
#define no puts("NO")
#define ios ios::sync_with_stdio(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int maxn = 1e6 + 6;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
LL qp(LL x,LL y){LL ans=1;x%=mod;while(y){if(y&1) ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;}
LL inv(LL x){return qp(x,mod-2);}
//head

LL x,k,f[maxn],z[maxn],cnt1[maxn],cnt2[maxn];
LL prime[maxn] = {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 calu(LL n,LL m){
    LL ans=0;
    while(n){
        ans+=n/m;
        n/=m;
    }
    return ans;
}
void solve(){
    for(int i=1;i<=25;i++){
        while(k%prime[i]==0){
            cnt1[prime[i]]++;k/=prime[i];
        }
    }
    for(int i=1;i<=25;i++){
        if(cnt1[prime[i]]){
            cnt2[prime[i]]=calu(x,prime[i]);
        }
    }
    LL ans=inf;
    for(int i=1;i<=25;i++){
        if(cnt1[prime[i]])ans=min(ans,cnt2[prime[i]]/cnt1[prime[i]]);
    }
    printf("%lld\n",ans);
}
int main(){
    z[1]=1;z[2]=0;z[3]=0;z[4]=2;
    z[5]=10;z[6]=4;z[7]=40;z[8]=92;
    z[9]=352;z[10]=724;z[11]=2680;z[12]=14200;
    z[13]=73712;z[14]=365596;

    f[1]=f[2]=1;
    for(int i=3;;i++){
        f[i]=f[i-1]+f[i-2];
        if(f[i]>1e18) break;
    }

    scanf("%lld%lld",&x,&k);

    for(int i=1;;i++){
        if(f[i]>1e18) break;
        if(f[i]==x){
            solve();return 0;
        }
    }

    printf("%lld\n",z[x%min(13*1ll,k)+1]);

}