n!素因子分解中素数p的幂

n!素因子分解中素数p的幂为 [n/p]+[n/(p^2)]+[n/(p^3)]+……

nefu 118 传送门

n!后面有多少个0

Problem : 118

Time Limit : 1000ms

Memory Limit : 65536K

description

从输入中读取一个数n,求出n!中末尾0的个数。

input

输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。

output

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

sample_input

3
3
100
1024

sample_output

0
24
253
 

对于任意一个正整数 若对其进行因式分解 那么其末尾的0必可以分解为2*5 

在这里 每一个0 必然和一个因子5相对应 

但 一个数的因式分解中因子5不一定对应着一个0 因为还需要一个因子2 

而对于n! 在因式分解中  2的因子个数要大于5的因子个数  

所以这题只要求出5的幂就可以了

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>

#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)

using namespace std;

int Read()
{
    char ch;
    int a = 0;
    while((ch = getchar()) == ' ' | ch == '\n');
    a += ch - '0';
    while((ch = getchar()) != ' ' && ch != '\n')
    {
        a *= 10;
        a += ch - '0';
    }
    return a;
}

void Print(int a)    //输出外挂
{
     if(a>9)
         Print(a/10);
     putchar(a%10+'0');
}

int main()
{
    //fread;
    int tc;
    scanf("%d",&tc);
    while(tc--)
    {
        int n;
        scanf("%d",&n);
        int five=5;
        int sum=0;
        while(five<=n)
        {
            sum+=n/five;
            five*=5;
        }
        printf("%d\n",sum);
    }
    return 0;
}

nefu 119  传送门

组合素数

Problem : 119

Time Limit : 1000ms

Memory Limit : 65536K

description

小明的爸爸从外面旅游回来给她带来了一个礼物,小明高兴地跑回自己的房间,拆开一看是一个很大棋盘(非常大),小明有所失望。不过没过几天发现了大棋盘的好玩之处。从起点(0,0)走到终点(n,n)的非降路径数是C(2n,n),现在小明随机取出1个素数p, 他想知道C(2n,n)恰好被p整除多少次?小明想了很长时间都没想出来,现在想请你帮助小明解决这个问题,对于你来说应该不难吧!

input

有多组测试数据。
第一行是一个正整数T,表示测试数据的组数。接下来每组2个数分别是n和p的值,这里1&lt;=n,p&lt;=1000000000。

output

对于每组测试数据,输出一行,给出C(2n,n)被素数p整除的次数,当整除不了的时候,次数为0。

sample_input

2
2 2
2 3

sample_output

1
1
 

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>

#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)

using namespace std;

int Read()
{
    char ch;
    int a = 0;
    while((ch = getchar()) == ' ' | ch == '\n');
    a += ch - '0';
    while((ch = getchar()) != ' ' && ch != '\n')
    {
        a *= 10;
        a += ch - '0';
    }
    return a;
}

void Print(int a)    //输出外挂
{
     if(a>9)
         Print(a/10);
     putchar(a%10+'0');
}

int main()
{
    //fread;
    int tc;
    scanf("%d",&tc);
    while(tc--)
    {
        int n,p;
        scanf("%d%d",&n,&p);
        int sum=0;
        double s=log(2.0*n)/log(1.0*p);
        int q=(int)s;
        int num=1;
        for(int i=1;i<=q;i++)
        {
            num*=p;
            sum=sum+(int)(2*n/num)-2*(int)(n/num);
        }
        printf("%d\n",sum);
    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 费马因子分解是一种简单的分解正整数的方法,但对于大数来说不够高效。下面是一个简单的Python实现,适用于小于100位的正整数。 ```python import math def fermat_factorization(n): a = math.ceil(math.sqrt(n)) b2 = a*a - n while not math.sqrt(b2).is_integer(): a += 1 b2 = a*a - n return int(a + math.sqrt(b2)), int(a - math.sqrt(b2)) n = 1234567891011121314151617181920212223242526272829 p, q = fermat_factorization(n) print(p, q) ``` 在上述代码,函数`fermat_factorization(n)`接受一个正整数n作为输入,返回n的两个因子p和q。具体实现过程如下: 1. 取a = ceil(sqrt(n)),即向上取整的n开根号的整数部分。 2. 计算b2 = a^2 - n。 3. 如果b2是完全平方数,则返回`int(a + sqrt(b2))`和`int(a - sqrt(b2))`,即n的两个因子。 4. 否则,令a = a + 1,重复步骤2和3,直到找到n的因子为止。 需要注意的是,这种算法仅适用于小于100位的正整数,并且不能保证总是能够找到整数n的因子。因此,在实际应用,需要使用更高效的因数分解算法,例如Pollard-Rho算法、Quadratic Sieve算法等。 ### 回答2: 费马因子分解是一种解析正整数的算法,它可以将一个正整数分解为质因子的乘积。在Python,可以使用以下代码实现费马因子分解: ```python def fermat_factorization(n): factors = [] # 如果n是偶数,则先将其分解为2的乘以奇数 while n % 2 == 0: factors.append(2) n //= 2 # 尝试用费马小定理分解n a = int(n ** 0.5) + 1 b2 = a * a - n while not is_square(b2): a += 1 b2 = a * a - n # 当b2是一个完全平方数时,可以将n分解为a + b和a - b b = int(b2 ** 0.5) factors.append(a + b) factors.append(a - b) return factors def is_square(n): root = int(n ** 0.5) return root * root == n ``` 以上代码,`fermat_factorization`函数接受一个正整数n作为参数,并返回其质因子分解的结果。在这个函数,首先通过循环将n的所有2都分解出来,然后使用费马小定理将n分解为两个因子(a + b和a - b)。其,`is_square`函数用于判断一个数是否是完全平方数。 使用以上代码,我们可以得到一个正整数的费马因子分解结果。例如,对于输入的正整数36,经过分解后,我们可以得到[2, 2, 3, 3]作为结果。 需要注意的是,费马因子分解在某些情况下可能会失败或运行非常慢,特别是在因子较大的情况下。因此,对于需要高效分解大整数的情况,可能需要使用其他更优化的算法。 ### 回答3: 费马因子分解是一种用于分解大整数质因数的算法,其最初由法国数学家费马提出。在Python,我们可以使用不同的方法实现费马因子分解。 一种常用的方法是“费马的小定理”,该定理指出,对于任何质数p和整数a,如果p不能整除a,则a^(p-1) ≡ 1 (mod p)。我们可以利用这个性质来找到整数n的质因数。 首先,我们可以随机选择一个整数a,并计算a^2 mod n。如果a^2 mod n = 1,则我们需要选择一个新的a。否则,我们可以计算最大公约数gcd(a^2-1, n)。如果gcd(a^2-1, n)不等于1或n,则我们找到了n的一个质因数。 以下是使用费马因子分解算法的Python代码示例: ```python import random def fermat_factorization(n): if n % 2 == 0: return 2 a = random.randint(2, n-1) x = pow(a, n-1, n) if x != 1: return None y = pow(a, (n-1)//2, n) candidate = gcd(y-1, n) if candidate == 1 or candidate == n: return None return candidate def gcd(a, b): while b != 0: a, b = b, a % b return a # 调用示例 n = 123456789 factor = fermat_factorization(n) if factor is None: print(f"{n} 是一个质数") else: print(f"{n} 的质因数为 {factor}") ``` 以上代码,我们随机选择一个整数a,并使用Python内置的`pow()`函数来计算指数模运算。然后,我们计算`gcd(a^2-1, n)`以寻找质因数。如果找到了质因数,则将其返回,否则返回None表示n是一个质数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值