数论中的若干定理
数论中的一些定理(学习自ACdreamers)
多边形公式
\(S=\frac{1}{2}\left|\sum\limits_{i=0}^{n-1}(X_iY_{i+1}-X_{i+1}Y_i)\right|\)
其中是相邻的点,对于n-1的i+1是0代表这第一个点,由于顺时针逆时针会使正负号改变,所以取绝对值。
摆线与圆面积关系
摆线留下的面积是圆面积的三倍。
摆线定义:摆线(cycloid)是数学中众多的迷人曲线之一.它是这样定义的:一个圆沿一直线缓慢地滚动,则圆上一固定点所经过的轨迹称为摆线.
两条直线夹角
\({\left|\frac{A_{1}B_{2}-A_{2}B_{1}}{A_{1}A_{2}+B_{1}B_{2}}\right|}\)
素数定理
\(\lim\limits_{n->\infty}\frac{\pi(n)}{n/\ln{n}}\)
\(\pi(n)\)为小于等于n的素数的个数
GCD(1)
a> 0;m,n > 0,那么有\(\gcd(a^m-1,a^n-1)=a^{gcd(m,n)}-1\)
GCD(2)
a>b;gcd(a,b)=1,那么\(\gcd(a^m-b^m,a^n-b^n)=a^{\gcd(m,n)}-{b^{\gcd(m,n)}}\)
GCD(3)
设\(G=\gcd(C_n^1,C_n^2,\cdots,C_n^{n-1})\),那么G的值为
(1). n为素数,那么答案就是n。
(2). n有多个素因子,那么答案就是1。
(3). n只有一个素因子,那么答案就是该因子。
GCD(4)
\(\sum\limits_{i=1}^{N}\gcd(i,N)=\sum\limits_{d|N}d\phi(\frac{N}{d})\)
\(\phi(x)\)为欧拉函数,d是N的质因子
Fibonacci(1)
设\(F_n\)为Fib数,那么有\(\gcd(F_m,F_n) = F_{gcd(m,n)}\)
Fibonacci(2)
给定两个互素的正整数A和B,那么它们最大不能组合的数为\(A*B-A-B\)不能组合的个数为\(num=\frac{(A-1)(B-1)}{2}\)
lcm(1)
\((n+1)lcm(C_n^0,C_n^1,\cdots,C_n^n)=lcm(1,2,\cdots,n+1)\)
lcm(2)
给一个正整数n,求\(lcm(1,2,3,\cdots,n)\)的值,(1<=n<=10^8)
定义\(L(n)\)为1,2,3,……,n的最小公倍数。则可以发现:
\[ L(n+1)=\left\{ \begin{aligned} & L(n)*p && 如果(n+1)是p的次方数 \\ & L(n) && 否则 \end{aligned} \right. \]
所以有:
L(1) = 1
L(2) = 1 * 2
L(3) = 1 * 2 * 3
L(4) = 1 * 2 * 3 * 2
L(5) = 1 * 2 * 3 * 2 * 5
L(6) = 1 * 2 * 3 * 2 * 5
L(7) = 1 * 2 * 3 * 2 * 5 * 7
代码如下
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;
typedef unsigned int uint;
const int N = 100000005;
const int M = 6000005;
const int SHIFT = 5;
const int RADIX = (1 << SHIFT) - 1;
int flag[(N>>SHIFT)+1];
uint sum[M];
int p[M];
int k;
inline void SetBit(int x)
{
flag[x>>SHIFT] |= (1<<(x&RADIX));
}
inline bool GetBit(int x)
{
return flag[x>>SHIFT] & (1<<(x&RADIX));
}
void isprime()
{
k = 0;
for(int i=2; i<N; i++)
{
if(!GetBit(i))
{
p[k++] = i;
for(int j=i+i; j<N; j+=i)
SetBit(j);
}
}
}
void Init()
{
sum[0] = p[0];
for(int i=1; i<k; i++)
sum[i] = sum[i-1] * p[i];
}
int main()
{
isprime();
Init();
int T,n,tt = 1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("Case %d: ",tt++);
uint ans = 1;
int cnt = 1;
while(1)
{
int m = (int)pow(n+0.9,1.0/cnt);
if(m < 2) break;
int i = lower_bound(p,p+k,m) - p;
if(p[i] != m) i--;
ans *= sum[i];
cnt++;
}
printf("%u\n",ans);
}
return 0;
}