BZOJ 1406: [AHOI2007]密码箱 exgcd+唯一分解定理

本文分享了一种解决数论问题的高级算法,通过分解质因数和扩展欧几里得算法,巧妙地求解特定数学方程的正整数解。此算法在竞赛编程中表现出高效和精确的特点。

推出来了一个解法,但是感觉复杂度十分玄学,没想到秒过~

Code: 

#include <bits/stdc++.h>
#define ll long long 
#define N 50000 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
namespace Math
{ 
    ll pp,answer;  
    ll exgcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll ans=exgcd(b,a%b,x,y);
        ll tmp=x;
        x=y,y=tmp-a/b*y;
        return ans;
    }
    void solve(ll A,ll B,ll C)
    {   
        ll x,y,gcd,b,ans;
        gcd = exgcd(A,B,x,y);                        
        if(C%gcd!=0) 
        {
            answer=-1; 
            return; 
        }    
        x*=C/gcd,B/=gcd;
        if(B<0) B=-B;  
        ans=x%B;     
        if(ans<=0) ans+=B; 
        answer=ans,pp=B;     
    } 
};   
priority_queue<int,vector<int>,greater<int> >q;   
map<int,int>mark;   
vector<int>v;       
int prime[N],vis[N],tot; 
void init()
{
    int i,j; 
    for(i=2;i<N;++i)
    {
        if(!vis[i]) prime[++tot]=i; 
        for(j=1;j<=tot&&prime[j]*i<N;++j)
        {
            vis[prime[j]*i]=1; 
            if(i%prime[j]==0) break;    
        }
    }
}   
int main()
{ 
    init();  
    // setIO("input"); 
    int n,i,j,h,flag=0;        
    scanf("%d",&n),h=n;     
    for(i=1;i<=tot&&h>=prime[i];++i)
    {
        if(h%prime[i]==0)
        {
            int cc=1;           
            for(;h%prime[i]==0;h/=prime[i]) cc*=prime[i];      
            v.push_back(cc);   
        }
    }   
    if(h!=1) v.push_back(h);   
    if(n%4==0) flag=1;   
    int len=v.size(); 
    for(i=0;i<(1<<len);++i)
    {
        int tmp=1;   
        for(j=0;(1<<j)<=i;++j)
        {
            if(i&(1<<j)) 
                tmp*=v[j]; 
        }
        int a=tmp,b=n/tmp,dd;   
        Math::solve(a,b,2);                     
        if(Math::answer!=-1)      
        {
            ll anss=Math::answer*a-1;
            while(anss>=0&&anss<n) 
            { 
            	if(!mark[anss]) mark[anss]=1,q.push(anss);     
            	anss+=Math::pp*a; 
            }
        }         
        swap(a,b); 
        Math::solve(a,b,2);                     
        if(Math::answer!=-1)      
        {
            ll anss=Math::answer*a-1;
            while(anss>=0&&anss<n)
            { 
            	if(!mark[anss]) mark[anss]=1,q.push(anss);   
            	anss+=Math::pp*a; 
            }
        }              
        if(flag) 
        {
        	if(b%2==0) swap(a,b);    
        	a/=2,b*=2;             
	        Math::solve(a,b,2);                        
	        dd=Math::pp;         
	        if(Math::answer!=-1)      
	        {    
	            ll anss=Math::answer*a-1;
	            while(anss>=0&&anss<n) 
	            {
	            	if(!mark[anss]) 
	            	{
	            		mark[anss]=1; 
	            		q.push(anss);   
	            	}
	            	anss+=Math::pp*a;    
	            }
	        }          
	        swap(a,b); 
	        Math::solve(a,b,2);                     
	        if(Math::answer!=-1)      
	        {
	            ll anss=Math::answer*a-1;
	            while(anss>=0&&anss<n) 
	            {
	            	if(!mark[anss]) 
	            	{
	            		mark[anss]=1; 
	            		q.push(anss);   
	            	}
	            	anss+=Math::pp*a; 
	            }
	        }  
        }
    }   
    while(!q.empty()) 
    {
    	printf("%d\n",q.top()); q.pop(); 
    }
    return 0; 
}

  

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)》的技术资源,聚焦于电力系统中低碳经济调度问题,结合N-1安全准则与分布鲁棒机会约束(DRCC)方法,提升调度模型在不确定性环境下的鲁棒性和可行性。该资源提供了完整的Matlab代码实现,涵盖建模、优化求解及仿真分析全过程,适用于复杂电力系统调度场景的科研复现与算法验证。文中还列举了大量相关领域的研究主题与代码资源,涉及智能优化算法、机器学习、电力系统管理、路径规划等多个方向,展示了广泛的科研应用支持能力。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源调度、智能电网相关工作的工程师。; 使用场景及目标:①复现高水平期刊(如EI/SCI)关于低碳经济调度的研究成果;②深入理解N-1安全约束与分布鲁棒优化在电力调度中的建模方法;③开展含新能源接入的电力系统不确定性优化研究;④为科研项目、论文撰写或工程应用提供可运行的算法原型和技术支撑。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与案例数据,按照目录顺序逐步学习,并重点理解DRCC建模思想与Matlab/YALMIP/CPLEX等工具的集成使用方式,同时可参考文中列出的同类研究方向拓展研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值