您的位置:首页 > 其它

初等数论之算术基本定理

2017-03-05 20:35 211 查看
定理: 每个大于1的正整数n都可以被唯一地表示成素数的乘积; n的分解式n =  p1 ^ a1 * p2 ^ a2 * p3 ^ a3 ……* pk ^ ak;其中p1,p2,……pk是素数,p1 < p2 < p3 …… pk;;

性质如下:

         1. d(n) = (a1 + 1) * (a2 + 1) * (a3 + 1) *……*(ak + 1) ,为n的正因子的数目;

         2.$(n) = (p1 ^(a1 + 1) - 1) / (p1 - 1)  *    (p2^(a2 + 1) - 1 )/( p2 - 1)   * …… * (pk^(ak + 1) - 1)/(pk - 1) 为所有的因子的乘积;

         3.gcd(a,b) = p1 ^ min(a1,b1) * p2 ^min(a2,b2) * …… * pk^min(ak,bk);

         4.lcm(a,b) = p1^max(a1,b1) * p2 ^max(a2,b2) * …… *pk^max(ak,bk);

         5.max(gcd(a,b)) + min(gcd(a,b)) == a + b;

         6.n ! 分解素数p 的幂为 [n / p ] + [n / p ^2] + [n / p ^3]…… ,[]为floor运算

       

nefu 118 n!后面有多少个0

思路: 10是由2 和5 这两个素数构成的,直接判断2的个数和5的个数,两个去最小的就好了;

#include<iostream>
#include<cstdio>

using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main()
{
int Tcase;
scanf("%d",&Tcase);
for(int ii = 1; ii <= Tcase; ii ++)
{
ll n;
scanf("%lld",&n);
ll temp;
int t1 = 0;
temp = 2;
while(n / temp >= 1)
{
t1 += n / temp;
temp *= 2;
}
int t2 = 0;
temp = 5;
while(n / temp >= 1)
{
t2 += n / temp;
temp *= 5;
}
cout << min(t1,t2) << endl;
}
return 0;
}

nefu 119组合素数

题意: 求C(2n,n)中有多少素数p,

思路: C(2n,n) = (2n)! / (n ! * n !),直接各自求出来然后相减一下就好了;

#include<iostream>
#include<cstdio>

using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main()
{
int Tcase;
scanf("%d",&Tcase);
for(int ii = 1; ii <= Tcase; ii ++)
{
int n,p;
scanf("%d%d",&n,&p);
int ans = 0;
ll temp = p;
while(2 * n / temp >= 1)
{
ans += 2 *n / temp;
temp *= p;
}
int t = 0;
temp = p;
while(n / temp >= 1)
{
t += n / temp;
temp *= p;
}
cout <<ans - 2 * t << endl;
}
return 0;
}



n!后面有多少个0


n!后面有多少个0

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: