hdu1695 综合数论 欧拉函数 分解质因子 容斥原理 打印素数表 各种模板

本文介绍了一种算法,用于解决给定a, b, c, d, k条件下,寻找满足gcd(x, y) = k且x ∈ [1, b], y ∈ [1, d]的所有符合条件的(x, y)对数问题。通过分析问题特点,利用欧拉函数与容斥原理等数学工具,给出了详细的实现步骤。

题目大意: 

给你a, b, c, d, k; 找出这样的一队 x, y, 使得 gcd(x , y) = k, 并且x ∈[1, b], y ∈ [1, d], 问有多少对符合要求的(x, y)。 


思路: gcd(x, y) == k 说明x,y都能被k整除, 但是能被k整除的未必gcd=k , 必须还要满足互质关系. 问题就转化为了求1~a/k 和 1~b/k间互质对数的问题可以把a设置为小的那个数, 那么以y>x来保持唯一性(题目要求, 比如[1,3] =[3,1] ) 接下来份两种情况: 

  1. y <= a , 那么对数就是 1~a的欧拉函数的累计和(容易想到) 
  2. y >= a , 这个时候欧拉函数不能用了,怎么做?  可以用容斥原理,把y与1~a互质对数问题转换为y的质数因子在1~a范围内能整除的个数(质数分解和容斥关系),   
#include <iostream>  
#include <stdio.h>  
#include <memory.h>  
#include<math.h>  
#include <vector>  
using namespace std;  
  
const int N = 100005;  
typedef long long LL;  
#define maxn 100005  
LL phi[N];  
vector<LL> link[N];  
int vis[1000000+5],c;    
LL prime[79000];    
void get_prime()  //打印素数表模板  
{    
    int i,j,n,m;    
    c=0;    
    n=1000000;    
    m=(int)sqrt(n+0.5);    
    memset(vis,0,sizeof(vis));    
    for(i=2;i<=m;i++)     
        if(!vis[i])    
        {    
            for(j=i*i;j<=n;j+=i)    
                vis[j]=1;    
        }    
    for(i=2;i<=n;i++) if(!vis[i])    
        prime[c++]=i;    
}    
  
  
void get_PHI()  //模板  得到1->n-1 与n互质的数的个数  存入phi[n]  (欧拉函数打表)
{    
    int i,j;    
    for (i = 1; i <= maxn; i++) phi[i] = i;    
    for (i = 2; i <= maxn; i += 2) phi[i] /= 2;    
    for (i = 3; i <= maxn; i += 2) if(phi[i] == i)    
    {    
        for (j = i; j <= maxn; j += i)    
            phi[j] = phi[j] / i * (i - 1);    
    }    
}  

int ouler(int x)  //欧拉函数:判断得到1->n-1 与n互质的数的个数 (不打表)
{  
    int i,j,k=1;  
    int m=x;  
    for(i=2;i<=m;i++)  
    {  
        if(m%i==0)  
        {  
            k=k*(i-1);  
            while(m%i==0)  
            {  
                m=m/i;  
                k*=i;  
            }  
            k/=i;  
        }  
    }  
    return k;  
} 


void init()     //求每一个数的质因数,vector储存    
{  
    LL i, j, k;  
    for(i = 1; i < N; i++)//求n的质因数  也是模板  
    {  
        k = i;  
        for(j = 0; prime[j]*prime[j] <= k; j++)  
        {  
            if(k%prime[j] == 0)  
            {  
                link[i].push_back(prime[j]);  
                while(k%prime[j] == 0)  
                    k /= prime[j];  
            }  
            if(k == 1) break;  
        }  
        if(k > 1) link[i].push_back(k);  
    }  
}  
  
LL make_ans(LL num,LL n)//1到num中的所有数与n的m个质因子不互质的数的个数 注意是不互质哦    容斥原理  
{    
    LL ans=0,tmp,i,j,flag;    
    for(i=1;i<(LL)(1<<link[n].size());i++)    
    { //用二进制来1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个因子被用到      
        tmp=1,flag=0;    
        for(j=0;j<link[n].size();j++)     
            if(i&((LL)(1<<j)))//判断第几个因子目前被用到     
                flag++,tmp*=link[n][j];//第j个质因子link[n][j]  
        if(flag&1)//容斥原理,奇加偶减      
            ans+=num/tmp;    
        else    
            ans-=num/tmp;    
    }    
    return ans;    
}    
  
  
int main()  
{  
    LL i, a, b, c, d, k, sum, t, zz = 1;//longlong型的数据 可以用%I64d 来输入输出  
    get_prime();  
    get_PHI();  
    init();  
    scanf("%I64d", &t);  
    while(t--)  
    {  
        scanf("%I64d %I64d %I64d %I64d %I64d", &a, &b, &c, &d, &k);  
        if(k == 0 || k > b || k > d)  
        {  
            printf("Case %I64d: 0\n", zz++);  
            continue;  
        }  
        if(b > d) swap(b, d);//保持d较大  
        b /= k;  
        d /= k;  
        sum = 0;  
        for(i = 1; i <= b; i++)  
        {  
            sum += phi[i];  
        }  
        for(i = b+1; i <= d; i++)  
        {  
            sum += b - make_ans(b, i);  
        }  
        printf("Case %I64d: %I64d\n", zz++, sum);  
    }  
  
    return 0;  
}  
概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过与传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计与实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子与电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面测试系统的动态与稳态性能,从而深刻理解最优滑模控制的核心机理与工程应用价值。
概要:本文提出了一种基于数据驱动的Koopman算子与递归神经网络(RNN)相结合的模型线性化方法,旨在解决纳米定位系统中因强非线性、迟滞和蠕变效应导致的建模困难问题。该方法通过Koopman算子将非线性动态系统映射至高维线性空间,利用RNN学习系统的时间序列演化特征,从而实现对复杂动态行为的精确建模与预测,并进一步集成于模型预测控制(MPC)框架中,显著提升了纳米定位系统的控制精度、动态响应能力与运行稳定性。整个算法体系在Matlab平台上完成代码实现与仿真实验验证,展示了良好的控制性能与工程应用潜力。; 适合人群:具备控制理论、非线性系统建模、机器学习及智能控制基础,从事精密仪器控制、高端制造装备研发、自动化系统设计等领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应对扫描探针显微镜、光刻机、超精密加工平台等纳米级定位设备中的非线性建模挑战;②提升高精度运动系统的实时预测控制性能,抑制迟滞与蠕变带来的定位误差;③为数据驱动的非线性系统线性化与先进控制策略(如MPC)的融合提供可复现、可扩展的技术范例。; 阅读建议:建议读者结合提供的Matlab代码,深入理解Koopman观测矩阵构造、RNN网络训练流程及MPC控制器设计之间的协同机制,重点关注数据预处理、特征提取、模型训练与闭环控制仿真的完整链路,以便在相似高精度控制系统中进行迁移与优化应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值