OJ_1104 整除问题

#include <iostream>
using namespace std;
const int N=1001;
const int INF=0x7fffffff;
int primesize=0;
int prime[N];
int nsum[N];
int asum[N];
void getprime(int n)
{
     int count=0;
     prime[count++]=2;
     
    
                   for(int i=3;i<=n;i++)
                   {
                           bool flag=true;
                           for(int j=2;j*j<=i;j++)
                           {
                                   if(i%j==0)
                                   {
                                             flag=false;
                                             break;
                                   }
                           }
                           if(flag)
                                   prime[count++]=i;
                                
                   }
                   
          primesize=count;         
    
 }
void func()
{
    
     getprime(N);// 计算N之前的PRIME并保存到数组中 
     int n,a;
     while(cin>>n>>a)
     {
                     
                     for(int i=0;i<primesize;i++)
                     {
                            int sum=0;
                            int t=prime[i];
                            int tmp=n;
                            while(tmp)
                            {
                                    sum+=tmp/t;
                                    tmp/=t;
                            } 
                            nsum[i]=sum;// N!中每个素数因数的个数
                            // 求N!对T的个数算法是Z=N/T+N/(T^2)+N/(T^3)…… 
                     } 
                     int k=INF;
                     for(int i=0;i<primesize;i++)
                     {
                             int t=prime[i];
                             int tmp=a;
                             int sum=0;
                             while(tmp%t==0)
                             {
                                       tmp/=t;
                                       sum++;
                             }
                             if(sum==0)continue;// 计算A对每个素因数的个数,如果为0略过这个素数 
                            if(nsum[i]/sum<k)// 如果有这个素数,循环求出最小的K,其中K是N!中素因数个数与A的商,因为有K个A 
                                 k=nsum[i]/sum;
                     }
                     cout<<k<<endl;
                     
     }
}
int main(int argc, char *argv[])
{
    
	//printf("Hello, world\n");
	func();
	return 0;
}

大数判断整除问题

其中用到的理论有:

1.任何数都可以分解为质因数的积;

2.求N!中含有T的质因数个数,算法是Z=N/T+N/(T^2)+N/(T^3)…… ;思路是

每个T的倍数中有一个T,小于等于N的数中有N/T个倍数,所以先加上N/T;

每个T^2的倍数中至少有两个T,但第一遍T的倍数也包括T^2的倍数,已经计算过一次,所以只用再加上N/T^2;

依次…………

直到N/T^X得到0为止,后面的都肯定为0,计算终结

3.若a能够整除b,则a的素因数,b都有,且相同素因数中b的素因数的幂大于等于a的素因数的幂。



题目描述:

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出:

一个整数.

样例输入:
6 10
样例输出:
1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值