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