n的阶乘在m进制下末尾有多少0
牛客-water
1,斐波那契数,递推
2,皇后数打表
3,进制转换
代码:
#include<bits/stdc++.h> /*#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<cmath> #include<iomanip> #include<queue> #include<cstring>*/ using namespace std; const int maxn=100; const int mod=19260817; const int inf=0x3f3f3f3f; typedef long long ll; typedef pair<int,int> pii; const int N=5e5+10; ll x; int m; int ans[]={0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712}; ll f[maxn]; void solve() { ll res=1e18; for(int i=2; i<=m; i++) { int cnt=0; while(m%i==0) { cnt++; m/=i; } if(cnt) { ll n=x,sum=0; while(n) { sum+=n/i; n/=i; } res=min(res,sum/cnt); } } cout<<res<<endl; } int main() { cin>>x>>m; f[1]=f[2]=1; for(int i=3; i<maxn; i++) f[i]=f[i-1]+f[i-2]; int flag=0; for(int i=1; i<maxn; i++) { if(x==f[i]) { flag=1; solve(); break; } } int z=x%min(13,m)+1; if(!flag) cout<<ans[z]<<endl;; system("pause"); return 0; }
n的阶乘在m进制下末尾0的个数
10进制下的500可以写成5*10^2;
2进制下的100可以写成1*2^2;
得到结果,末尾有几个0,幂就为几;
求一个数n在m进制下0的个数,实际上就是求出满足n=a*m^k,最大的k
那么求:n!=a*m^k;最小的k
1,对n!分解质因数;
任何一个数都可以分解成为若干质因数的乘积
设n!=a*mk=a*(p1q1,p2q2,…,pnqn)k,可以求出n!中p1,p2,…,pn的出现次数,假设分别为x1,x2,…,xn,那么有x1=k1q1,x2=k2q2,…,xn=knqn。因为a的影响,显然最终的答案k = min{ k1,k2,…,kn };
已知q1=m%p1直到不能整除;(按最大计算,最后k取最小)
则k=sum/q1;(sum某一质因子个数,);
代码:(可以打表,也可以直接素数筛);//这里是打表;
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int mod=19260817; const int inf=0x3f3f3f3f; typedef long long ll; typedef pair<int,int> pii; const int N=5e5+10; ll prime[] = {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 ind[108];//有几个素数即q1的值 ll cnt[108];//存q1*k; ll getcnt(ll p,ll x)//获得q1*k的值 { ll res=0; while(x){ res+=x/p; x/=p; } return res; } int main() { ll n,m; cin>>n>>m; int mm=m; for(int i=1;i<=25;i++) { while(mm%prime[i]==0) { ind[prime[i]]++; mm/=prime[i]; } } for(int i=1;i<=25;i++) { if(ind[prime[i]]) { cnt[prime[i]]=getcnt(prime[i],n); } } ll ans=1e18+1; for(int i=1;i<=25;i++) { if(ind[prime[i]]) { ans=min(ans,cnt[prime[i]]/ind[prime[i]]);//所有k取最小值; } } cout<<ans<<endl; system("pause"); return 0; }