数论中的若干定理

数论中的一些定理(学习自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;  
}  
posted @ 2016-08-08 04:12  Thecoollight  阅读(497)  评论(0编辑  收藏  举报