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;
}
BZOJ 1406: [AHOI2007]密码箱 exgcd+唯一分解定理的更多相关文章
- BZOJ 1406: [AHOI2007]密码箱
二次联通门 : BZOJ 1406: [AHOI2007]密码箱 /* BZOJ 1406: [AHOI2007]密码箱 数论 要求 x^2 ≡ 1 (mod n) 可以转换为 x ^ 2 - k * ...
- bzoj 1406: [AHOI2007]密码箱 二次剩餘
1406: [AHOI2007]密码箱 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 701 Solved: 396[Submit][Status] D ...
- BZOJ 1406: [AHOI2007]密码箱( 数论 )
(x+1)(x-1) mod N = 0, 枚举N的>N^0.5的约数当作x+1或者x-1... ------------------------------------------------ ...
- 1406: [AHOI2007]密码箱
1406: [AHOI2007]密码箱 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1591 Solved: 944[Submit][Status][ ...
- 【BZOJ】1406: [AHOI2007]密码箱
http://www.lydsy.com/JudgeOnline/problem.php?id=1406 题意:求$0<=x<n, 1<=n<=2,000,000,000, 且 ...
- NOIP2009Hankson 的趣味题[唯一分解定理|暴力]
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- uva10375 Choose and Divide(唯一分解定理)
uva10375 Choose and Divide(唯一分解定理) 题意: 已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s ...
- 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...
随机推荐
- 倍增-RMQ问题Sparse-Table算法
提示 code: #include<bits/stdc++.h> #define ll long long #define inf 0x7fffffff using namespac ...
- 11-Perl 运算符
1.Perl 运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号,如: 3+2=5.Perl 语言内置了丰富的运算符,我们来看下常用的几种: 算术运算符,比较运算符,逻辑运算符,赋值运算符,位 ...
- HashMap的四种遍历方式
package com.xt.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; impor ...
- 支付宝小程序室内地图导航开发-支付宝小程序JS加载esmap地图
如果是微信小程序开发,请参考微信小程序室内地图导航开发-微信小程序JS加载esmap地图文章 一.在支付宝小程序里显示室内三维地图 需要满足的两个条件 调用ESMap室内地图需要用到小程序web-vi ...
- vue-无限滚动
<ul class="infinite-list" v-infinite-scroll="load" style="overflow:auto& ...
- php使用rdkafka进行消费
如仅作为消费者或生产者,直接使用下面消费者或生产者的代码,并安装扩展即可. PHP要安装rdkafka扩展,而rdkafka又依赖librdkafka,因此你需要安装rdkafka和librdkafk ...
- Phoenix设置联合主键
1例如 create table test12(email varchar not null,id integer not null,name varchar not null,age integer ...
- thinkphp5 二维码生成 composer
进入extend文件夹 composer require endroid/qrcode 2.将二维码生成封装为服务 QrcodeServer.php代码如下: <?php /** * Creat ...
- 电子工程师需要了解的SMT贴片质量问题汇总(转)
点胶工艺中常见的缺陷与解决方法 拉丝/拖尾 拉丝/拖尾是点胶中常见的缺陷,产生的原因常见有胶嘴内径太小.点胶压力太高.胶嘴离PCB的间距太大.贴片胶过期或品质不好.贴片胶粘度太好.从冰箱中取出后未能恢 ...
- 博弈论BOSS
基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_c ...