OJ_1104 整除问题

来源:互联网 发布:linux scp 传输文件夹 编辑:程序博客网 时间:2024/06/06 04:20
#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
原创粉丝点击