UVA 10139 Factovisors

来源:互联网 发布:小霸王网络电视32寸 编辑:程序博客网 时间:2024/05/21 11:46
一道数论题,题意大致是判断一个数m是不是另一个数n的阶乘的因子。判断其实也非常的简单就是看m的因子的的个数是否多于n的阶乘中相应的因子的个数;而计算n的阶乘中因子p的个数由一个算法计算代码如下</span>
int Cal(int w, int p) //计算w的阶乘中有多少个p{    int ans = 0;    while(w)    {        w /= p;        ans += w;    }    return ans;}

而最后实现的代码是

h = n;j = 0;while(h){     h /= p[i];      j += h; }

其中j是最终的计数的个数;

最终的代码如下

#include <iostream>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <functional>#include <cstdio>#include <queue>#include <map>#include <algorithm>#include <stack>#include <utility>typedef  long long ll;using namespace std;const int mx = 100000;int cnt,N,p[mx];bool tag[mx];void get_prime (){    int i,j;    cnt = 0;    N = mx;    for(i = 2; i < N; i ++)    {        if(!tag[i]) p[cnt++] = i;        for(j = 0; i * p[j] < N&&j < cnt; j++)        {            tag[i *p[j]] = 1;            if(i % p[j] == 0)                break;        }    }}int main (){    bool OK;    int k,i,l,j,h;    int n,m;    get_prime ();    while (~scanf("%d%d",&n,&m))    {        if(n >= m)        {            printf("%d divides %d!\n",m,n);            continue;        }        OK = true;        l = m;        for(i = 0; i < cnt && p[i] * p[i] <= m &&OK; i++)            if(m % p[i] == 0)            {                k = 0;                while(m % p[i] == 0)                {                    k++;                    m = m / p[i];                }                h = n;                j = 0;                while(h)                {                    h /= p[i];                    j += h;                }                if(k > j)                    OK = false;            }        if(m != 1 && n < m)            OK = false;        if(OK) printf("%d divides %d!\n",l,n);        else printf("%d does not divide %d!\n",l,n);    }    return 0;}

一开始写的时候wa了好多发,主要原因是在处理最终m最终还是一个质数的情况,一开始想的是如果m没有被分成1都不行,可是最后发现只要m小于n就行。

0 0
原创粉丝点击