题意:
其中,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]);
}

京公网安备 11010502036488号