九度OJ 1104:整除问题 (整除、因式分解)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4142

解决:1346

题目描述:

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

输入:

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

输出:

一个整数.

样例输入:
6 10
样例输出:
1
来源:
2011年上海交通大学计算机研究生机试真题

思路:

对a进行因式分解,记录素因子以及个数。计算n!过程中,累加记录的相关素因子个数,直到所有的素因子个数都超过a的素因子个数乘(k+1),这时的n减去1就是答案。

但该题如果给定输入数据不当,可能会存在bug,即对所有的k,都同时满足或同时不满足被a^k整除和被a^(k+1)整除。


代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
 
#define N 1000 
     
int p[N+1], cp;
     
typedef struct node {
    int num;
    int count;
    int acount;
} PP;
 
PP pa[N+1];
int cpa;
     
int isprime(int x) 
{           
    for (int i=2; i<=sqrt(x); i++)
    {
        if (x%i == 0)
            return 0;
    }
    return 1;
}   
     
void getPrimes(int x)
{   
    int i = 1;
    cpa = 0;
    while (x != 1)
    {       
        if (x % p[i] == 0)
        {   
            cpa ++;
            pa[cpa].num = p[i];
            pa[cpa].count = 0;
            while (x % p[i] == 0)
            {
                pa[cpa].count ++;
                x /= p[i];
            }
        }
        i ++;
    }
}
 
int main(void)
{
    int n, a, k, i, j, r;
 
    cp = 0;
    for (i=2; i<=N; i++)
    {
        if (isprime(i))
            p[++cp] = i;
    }
 
    //for (i=1; i<=cp; i++)
    //  printf("%d ", p[i]);
    //printf("\n");
 
    while (scanf("%d%d", &n, &a) != EOF)
    {
        getPrimes(a);
        for (r=1; r<=cpa; r++)
            pa[r].acount = 0;
        for(i=2; i<=n; i++)
        {
            j = i;
            r = 1;
            while (j != 1)
            {
                if (r > cpa)
                    break;
                while (j%(pa[r].num) == 0)
                {
                    pa[r].acount ++;
                    j /= (pa[r].num);
                }
                r ++;
            }
        }
        k = pa[1].acount/pa[1].count;
        for (r=2; r<=cpa; r++)
        {
            int kk = pa[r].acount/pa[r].count;
            if (kk < k)
                k = kk;
        }
        printf("%d\n", k);
        //for (r=1; r<=cpa; r++)
        //  printf("%d %d %d\n", pa[r].num, pa[r].count, pa[r].acount);
    }
     
    return 0;
}       
/**************************************************************
    Problem: 1104
    User: liangrx06
    Language: C
    Result: Accepted
    Time:10 ms
    Memory:944 kb
****************************************************************/


posted on 2015-10-23 17:33  梁山伯  阅读(296)  评论(0编辑  收藏  举报

导航