BZOJ 1406: [AHOI2007]密码箱 exgcd+唯一分解定理
2024-09-05 11:29:00
推出来了一个解法,但是感觉复杂度十分玄学,没想到秒过~
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;
}
最新文章
- Jenkins 集成打包和上传 App Store 的冲突
- Thread 与 Runnable
- 初探appium之元素定位(1)
- shell脚本变量定义注意别跟系统变量重名了……
- AngularJS应用的解析
- Unable to read TLD ";META-INF/c.tld";错误
- 几个个实用的PHP代码片段【自己备份】
- 利用VC助手(VA)添加注释
- swift-数组array
- 弹性布局Flex的基本语法
- Array类的Sort()方法
- mxnet框架样本,使用C++接口
- CICD自动化发版系统设计简介
- 使用Excel过滤重复数据
- 异常:分为 严重性错误:Error 异常:Exception
- centos7配置openldap服务器
- layui栅格布局问题
- Java集合入门
- Python3中map函数的问题
- sql 脚本 oracle scott 用户的四张表导入 mysql 中
热门文章
- application.properties参数详解
- windows安装npm教程
- centos7安装配置NFS文件共享存储
- 使用 “Unicode 字符集 ” 使用错误,应该使用 “使用多字节字符集”
- 关于C++内存对齐
- vue入门:(计算属性和侦听器)
- prototype,__proto__,constructor理解
- odoo 关系字段(关联关系)
- CAN总线简介:如何以编程方式控制汽车
- 如何在国内跑Kubernetes的minikube