【基本算术定理 && 质因数分解】LightOJ - 1341 Aladdin and the Flying Carpet
2017-10-16 16:38
483 查看
Problem Description
a面积,b为其中一条边最小长度,问你能组成不同矩形不包含正方形的个数。
思路:
算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*P3^a3……Pn^an,这里P1小于P2小于P3……小于Pn均为质数,其中指数ai是正整数。
定理应用:
(1) 一个大于1的正整数N,如果它的标准分解式为:N = P1^a1*P2^a2*P3^a3……Pn^an,那么它的正因数个数为:σ(n) = (1 + a1)*(1 + a2)…(1 + an)。
(2) 它的全体正因数之和为:σ(n) = (1+p1+p1^2+…+p1^a1)*(1+p2+p2^2+…+p2^a2)…(1+pn+pn^2+…+pn^an)。
(3) 利用算数基本定理可以重新定义整数a和b的最大公因子(a, b) 和 最小公倍数[a, b], 并证明a*b = (a, b)*[a, b]。
(4) 此外还可证明根号2是无理数等等。
(5) 证明素数个数无限。
正因数之和也可以写作:
σ(n) = (p1^(a1+1) - 1) / (p1 - 1) * (p2^(a2+1) - 1) / (p2 - 1) * … * (pk^(ak + 1) - 1) / (pk - 1)。
a面积,b为其中一条边最小长度,问你能组成不同矩形不包含正方形的个数。
思路:
算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*P3^a3……Pn^an,这里P1小于P2小于P3……小于Pn均为质数,其中指数ai是正整数。
定理应用:
(1) 一个大于1的正整数N,如果它的标准分解式为:N = P1^a1*P2^a2*P3^a3……Pn^an,那么它的正因数个数为:σ(n) = (1 + a1)*(1 + a2)…(1 + an)。
(2) 它的全体正因数之和为:σ(n) = (1+p1+p1^2+…+p1^a1)*(1+p2+p2^2+…+p2^a2)…(1+pn+pn^2+…+pn^an)。
(3) 利用算数基本定理可以重新定义整数a和b的最大公因子(a, b) 和 最小公倍数[a, b], 并证明a*b = (a, b)*[a, b]。
(4) 此外还可证明根号2是无理数等等。
(5) 证明素数个数无限。
正因数之和也可以写作:
σ(n) = (p1^(a1+1) - 1) / (p1 - 1) * (p2^(a2+1) - 1) / (p2 - 1) * … * (pk^(ak + 1) - 1) / (pk - 1)。
#include<bits/stdc++.h> using namespace std; #define N 1000055//素数表到根号最大值,如果大于表的值是素数,特判一下就可以了 int vis , n, prime ;//vis[i]为0代表i是素数,prime[]用来存素数,n是素数的个数 void get_prime()//打素数表 { int i, j; n = 0; memset(vis, 0, sizeof(vis)); vis[1] = vis[0] = 1; for(i = 2; i <= N - 55; i++) { if(!vis[i]) { prime[n++] = i; for(j = 2*i; j <= N - 55; j = j + i) vis[j] = 1; } } } int factor(long long num)//质因数分解 { int ans = 1, sum; for(int i = 0; (long long)prime[i]*prime[i] <= num && i < n; i++) { sum = 0; while(num % prime[i] == 0) { sum++; num /= prime[i]; } ans *= (1+sum);//因数的个数为分解成的素数的指数+1的乘积 } if(num != 1) ans *= 2;//如果num是一个大于素数表最大值得素数 return ans / 2; } int main() { int T, cas = 1; scanf("%d", &T); get_prime(); while(T--) { long long a, b; scanf("%lld %lld", &a, &b); long long m = sqrt(a); if(m * m > a) m--; if(b > m) {//输出0,因为b*b>a printf("Case %d: 0\n", cas++); } else { int ans = factor(a);//求a的质因数有几对 for(int i = 1; i < b; i++) { if(a % i == 0) ans--; } printf("Case %d: %d\n", cas++, ans); } } return 0; }
相关文章推荐
- LightOJ 1341 Aladdin and the Flying Carpet(算术基本定理)
- LightOJ 1341 Aladdin and the Flying Carpet(算术基本定理)
- lightoj 1341 - Aladdin and the Flying Carpet / lightoj 1236 - Pairs Forming LCM(算术基本定理)
- LightOJ 1341 - Aladdin and the Flying Carpet(算术基本定理啊)
- LightOj1341_Aladdin and the Flying Carpet_算数基本定理
- Lightoj1341——Aladdin and the Flying Carpet(算术基本定理)
- 【算数基本定理(唯一分解定理)】Aladdin and the Flying Carpet LightOJ - 1341
- LightOJ 1341 Aladdin and the Flying Carpet(质因数分解、因子个数)
- LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理)
- Aladdin and the Flying Carpet (算术基本定理)
- C - Aladdin and the Flying Carpet(算术基本定理)
- Light OJ 1341 Aladdin and the Flying Carpet(算数基本定理)
- LightOJ 1341 - Aladdin and the Flying Carpet (唯一分解定理 + 素数筛选)
- Aladdin and the Flying Carpet LightOJ - 1341 数论/唯一分解定理
- Aladdin and the Flying Carpet (算术基本定理)
- LightOJ - 1341 Aladdin and the Flying Carpet(唯一分解定理)
- Aladdin and the Flying Carpet(算术基本定理)
- Aladdin and the Flying Carpet LightOJ - 1341(合数)唯一分解定理
- LightOJ 1341 - Aladdin and the Flying Carpet
- lightOJ 1341 Aladdin and the Flying Carpet