zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
    WCF快速上手(二)
    Oracle递归查询
    100多行代码实现6秒完成50万条多线程并发日志文件写入
    C#写日志工具类
    WPF定时刷新UI界面
    HttpUtil工具类
    WPF GridView的列宽度设置为按比例分配
    Visifire图表
    C# BackgroundWorker 的使用、封装
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/13391635.html
Copyright © 2011-2022 走看看