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

    题目描述

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

    输入描述:

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

    输出描述:

    一个整数.
    示例1

    输入

    6 10
    

    输出

    1

    最终AC代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int n, a;
        while(cin >> n >> a){
            int t, ans=1e9, rn[1001]={0};
            for(int i=2; i<=n; i++){ //n!质因子分解
                t = n;
                while(t){
                    rn[i] += t / i;
                    t /= i;
                }
            }
            for(int i=2; i<=a; i++){ //a的质因子分解
                t = 0;
                while(a%i == 0){
                    t++;
                    a /= i;
                }
                if(t == 0) continue;
                ans = min(ans, rn[i]/t);
            }
            printf("%d
    ", ans);
        }
        return 0;
    }

    总结:这题用常规思路是没法做出来的,因此数据太大。然后,在评论区看见了以下分析,很有趣(链接):

     我上面写的代码没有找出找出素数,但是代码更简洁,在考场上也能解决一些时间。但是,为什么有这个规律,我目前也不是很理解。记录此题的本意是,一个正整数阶乘 => 是可以转化为素数的表达形式的~或者说,任何一个大于1的数都可以表示成这种形式吧?然后,以下部分的代码很经典~

    for(int i=2; i<=n; i++){ //n!质因子分解
        t = n;
        while(t){
            rn[i] += t / i;
            t /= i;
        }
    }

    采用素数表示阶乘,很自然地化解了数据非常大的问题。以后依据大整数的问题,希望能够想起这个思路。

  • 相关阅读:
    UV动画
    使用RampTexture实现BRDF效果
    使用RampTexture来控制diffuse shading
    Half Lambert
    Lamber算法 & SurfaceShader自定义光照
    What is _MainTex_ST ?
    C# Enum,Int,String的互相转换
    Plugins in Unity
    Mono在Full AOT模式下的限制
    雾化
  • 原文地址:https://www.cnblogs.com/heyour/p/12730600.html
Copyright © 2011-2022 走看看