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;
}

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM