暑假集训 || 初等数论

·中国剩余定理

·扩展中国剩余定理

·莫比乌斯反演

void Moblus()
{
    memset(check,false,sizeof(check));
    mu[1] = 1;
    int tot = 0;
    for(int i = 2; i <= MMX; i++)
    {
        if( !check[i] )
        {
            prime[tot++] = i;
            mu[i] = -1;
        }
        for(int j = 0; j < tot; j++)
        {
            if(i * prime[j] > MMX) break;
            check[i * prime[j]] = true;
            if( i % prime[j] == 0)
            {
                mu[i * prime[j]] = 0;
                break;
            }
            else
            {
                mu[i * prime[j]] = -mu[i];
            }
        }
    }
}
View Code

·法雷级数

就是这个东东

中间每一个数的分子都是它左右两数分子之和,分母也是

扫描二维码关注公众号,回复: 2909091 查看本文章

用途:分数逼近,类似二分

HDU 6290

题意:给一个无理数,求出分母在1e5以内的最接近它的最简分数

思路:法雷级数里面能表示所有最简的真分数,用类似二分的方法不断逼近,取两个数中间的分数看要求的无理数在它的左边还是右边

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef long double LD;
const int SZ = 1000100;
const int eps = 1e-9;
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int k;
        scanf("%d", &k);
        LD dk = pow((LD)k, (LD)2.0/3.0);
        LL tmp = floor(dk);
        dk -= tmp;
        LL a1 = 0, a2 = 1, b1 = 1, b2 = 1;
        while(b1+b2 <= 100000LL)
        {
            LL mida = a1+a2, midb = b1+b2;
            LD ans = (LD)mida / midb;
            if(ans < dk) a1 = mida, b1 = midb;
            else a2 = mida, b2 = midb;
        }
        LD ans1 = (LD)a1 / b1, ans2 = (LD)a2 / b2;
        if(dk - ans1 < ans2 - dk) printf("%lld/%lld\n", a1 + tmp * b1, b1);
        else printf("%lld/%lld\n", a2 + tmp * b2, b2);
    }
    return 0;
}
View Code

·指数循环节

·Lucas定理

·BM算法

猜你喜欢

转载自www.cnblogs.com/pinkglightning/p/9545233.html