数论板子

本文介绍了一种高效的素数筛选算法,并进一步展示了如何利用类似的方法快速生成欧拉函数表及求解最大公约数等问题。此外,还探讨了扩展欧几里得算法的应用,包括求解特定类型的不定方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//筛法求MAXN范围以内的素数表,其中需要借用一个bool数组vis  
void prime_table()   
{  
    int i,j;  
    for(i = 2;i <= MAXN;i++)  
    {  
        if(!vis[i])  
        {  
            prime[++cnt] = i;                //cnt为素数计数器  
            for(j = i*i;j <= MAXN;j += i)  
                vis[j] = true;  
        }  
    }  
}  
//高效算法同时打出prime表与phi表,比单独用筛法打出phi表与prime表快3倍左右
void prime_phi_table()
{
    int i,j;
    phi[1] = 1;
    for(i = 2;i <= MAXN;i++)
    {
        if(!vis[i])
        {
            prime[++cnt] = i;
            phi[i] = i-1;
        }
        for(j = 1;j <= cnt && i * prime[j] <= MAXN;j++)
        {
            vis[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}
//求n的欧拉函数值  
int phi(int n)  
{  
    int t = sqrt(n + 0.5);  
    int ans = 1;  
    for(int i = 2;i <= t;i++)  
    {  
        if(n % i == 0)  
        {  
            ans *= (i-1);  
            n /= i;  
            while(n % i == 0)  
            {  
                ans *= i;  
                n /= i;  
            }  
        }  
        if(n == 1) break;  
    }  
    if(n > 1) ans *= (n-1);  
    return ans;  
}  
//求a与b的最大公约数,其中b > a  
int gcd(int a,int b)   
{  
    if(a > b) swap(a,b);  
    while(a)  
    {  
        int t = b % a;  
        b = a;  
        a = t;  
    }  
    return b;  
}  
//扩展欧几里得,ax + by = c,求出x,y的一组整数解,d = gcd(a,b),当 c % d != 0时,无整数解  
void exgcd(int a,int b,int &d,int &x,int &y)  
{  
    if(!b) {d = a; x = 1; y = 0;}  
    else {  
            exgcd(a%b,a,d,y,x);  
            y -= x*(a/b);  
    }  
}  
<pre name="code" class="cpp">//在上述不定方程中,若方程为ax + by = gcd(a,b),当求出一组整数解x0,y0后  
//关于x,y的通解则有:x = x0 + b/d * k , y = y0 - a/d * t (t为任意整数)  
[cpp] view plain copy
<pre name="code" class="cpp">//由于模运算的特殊性,在计算(a / b) % m 时,当a、b太大需要事先取模,此时该式不能直接写为:  
// ((a % m) / (b % m)) % m  
// 而是需要先算出 ax≡1(mod m),此时x为a的逆元。这个式子等价于ax + my = 1(此时gcd(a,b)必须为1,否则无解)  
// 此时使用扩展欧几里得即可解决:exgcd(a,m,d,x,y);当m为质数时,x = (a^(m-2)) % m;  
//但求出来的x可能为负数,需要写成(x + m) % m  
// 最终式子为 (a / b) % m = a * x % m  
//对整数n进行唯一分解,A[cnt].prime为n的第cnt个质因子,A[cnt].num为该质因子的指数  
void dissolve(int n)  
{  
    int i;  
    int t = sqrt(n + 0.5);  
    for(i = 2;i <= t;i++)  
    {  
        if(n % i == 0)  
        {  
            cnt++;  
            A[cnt].prime = i;  
            while(n % i == 0)  
            {  
                A[cnt].num++;  
                n /= i;  
            }  
        }  
        if(n == 1) break;  
    }  
    if(n > 1)                     //若n为质数  
    {  
        cnt++;  
        A[cnt].prime = n;  
        A[cnt].num = 1;  
    }  
}  
//求1~n行的组合数,即杨辉三角表,注意,为了防止数组越界,此时C(0,0)为数组第一行,且第n行代表C(n-1,k)  
void Make_up_num_table(int n)  
{  
    C[1][1] = 1;  
    C[2][1] = 1; C[2][2] = 1;  
    for(int i = 3;i <= n;i++)  
        for(j = 1;j <= i;i++)  
            C[i][j] = C[i-1][j-1] + C[i-1][j];  
}  
[cpp] view plain copy
//求第n行的组合数,和杨辉三角的区别是这个只求一行但是为O(n)的时间复杂度  
//注意,这个函数出于求解方便,第n行代表的是C(n,k)且是从0开始存,与上一个函数不同  
void Make_up_num(int n)  
{  
    A[0] = 1;  
    for(int i = 1;i <= n;i++)  
        A[i] = A[i-1] * (n - i + 1) / i;  
}  
1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值