zoukankan      html  css  js  c++  java
  • 整除问题

    题目描述:
    给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
    输入:
    两个整数n(2<=n<=1000),a(2<=a<=1000)
    输出:
    一个整数.
    样例输入:
    6 10
    样例输出:
    1
     
     
    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
     
    bool mark[1001];
    int prime[1001];
    int size=0;
    void init(){
    for (int i=2;i<=1000;i++)
    mark[i]=false;
    for (int i=2;i<=1000;i++){//输入数据是10^9,这里用100000以下的素数做分解是因为n的大于sqrt(n)的因子只能有一个
    if (mark[i])
    continue;
    prime[size++]=i;
    if (i>=100) continue;//没加这句程序就崩溃了,应该是因为i>1000,那么j就越界了
    for (int j=i*i;j<=1000;j+=i){
    mark[j]=true;
    }
    }
    }
     
    int main (){
    int n,a;
    int ans[30];
    int as;
    int anscnt[30];
    init();
    while (cin>>n>>a){
    as=0;
    for (int i=0;i<size;i++){
    if (a%prime[i] == 0){
    ans[as]=prime[i];
    anscnt[as]=0;
     
    while(a%prime[i] == 0){
    anscnt[as]++;
    a /= prime[i];
    }
     
    as++;
    if (a==1)
    break;
    }
     
    }
     
    if (a!=1){
    ans[as]=a;
    anscnt[as++]=1;
    }
     
    int k=1000000;
    int temp=0;
    int tt=0;
    for (int i=0;i<as;i++){
    temp=0;
    for (int j=n;j>1;j--){
    int nn=j;
    while (nn%ans[i] == 0){
    temp++;
    nn /= ans[i];
    tt=temp/anscnt[i];
    if (tt>=k)
    break;
    }
     
    }
    if (tt< k)
    k=tt;
    }
     
    cout<<k<<endl;
     
    }
    return 0;
    }
     
    这是自己做得,没有按照书上的方法。
    思路是先计算a的素因子,个数为x,然后计算每一个素因子在n!中有y个,所有素因子的y/x的最小值即为答案。
    由于输入数据是1000,所以输入数据的不同素因子个数最多为6.(2*3*5*7*11*13就已经超过了1000)
  • 相关阅读:
    文件内部写入及读取(参考疯狂安卓讲义)
    API内部文件读取
    内部存储文件(读)
    内部存储文件(写)
    短信发送器(1.0版)
    按钮点击的三种方法及推广
    struts标签错误:Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"
    java中16进制转换10进制
    java project转变成java web project
    oracle,sqlserver,mysql常见数据库jdbc连接
  • 原文地址:https://www.cnblogs.com/yexiaoqi/p/7225669.html
Copyright © 2011-2022 走看看