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

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+唯一分解定理的更多相关文章

  1. BZOJ 1406: [AHOI2007]密码箱

    二次联通门 : BZOJ 1406: [AHOI2007]密码箱 /* BZOJ 1406: [AHOI2007]密码箱 数论 要求 x^2 ≡ 1 (mod n) 可以转换为 x ^ 2 - k * ...

  2. bzoj 1406: [AHOI2007]密码箱 二次剩餘

    1406: [AHOI2007]密码箱 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 701  Solved: 396[Submit][Status] D ...

  3. BZOJ 1406: [AHOI2007]密码箱( 数论 )

    (x+1)(x-1) mod N = 0, 枚举N的>N^0.5的约数当作x+1或者x-1... ------------------------------------------------ ...

  4. 1406: [AHOI2007]密码箱

    1406: [AHOI2007]密码箱 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1591  Solved: 944[Submit][Status][ ...

  5. 【BZOJ】1406: [AHOI2007]密码箱

    http://www.lydsy.com/JudgeOnline/problem.php?id=1406 题意:求$0<=x<n, 1<=n<=2,000,000,000, 且 ...

  6. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  7. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  8. 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 ...

  9. 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...

随机推荐

  1. RHEL8运维新利器--Cockpit使用方法

    在web浏览器中查看服务器并使用鼠标执行系统任务,很容易管理存储.配置网络和检查日志等操作. # 安装cockpit yum -y install cockpit # 启用cockpit system ...

  2. STL-set 容器以及迭代器的简单理解

    先说下set的基本操作和时间复杂度 begin()     ,返回set容器的第一个元素 end() ,返回set容器的最后一个元素 clear()        ,删除set容器中的所有的元素 em ...

  3. Sql Server--如何自动备份数据

    下面我来讲一下如何通过维护计划来实现完整备份+差异备份: (1)在SSMS的对象资源管理器中右击“维护计划”,选择“维护计划向导”,系统将弹出向导窗口,如图: 这里向导已经告诉我们维护计划到底能够干什 ...

  4. Cognex925B的使用方法

    一.Cognex925B的简介                                           Cognex925B是一款线激光扫描传感器,利用激光三角的原理测量Z方向的断差. 二 ...

  5. c# winfrom 界面设计

    1.在用DotnetBar的RibbonControl时,界面最大化时,会把电脑桌面的任务栏遮盖住: 解决办法:在load事件中写入: , Screen.PrimaryScreen.WorkingAr ...

  6. luogu题解 P2184 【贪婪大陆】

    题目链接: https://www.luogu.org/problemnew/show/P2184 思路: 首先我想吐槽一下为什么现有题解中的做法都是一样的,而且还比较难以理解; 我就讲下我的做法,本 ...

  7. O049、准备 LVM Volume Provider

    参考https://www.cnblogs.com/CloudMan6/p/5597790.html   Cinder 真正负责volume 管理的组件是 volume provider .Cinde ...

  8. Python算法题(一)——青蛙跳台阶

    题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: ...

  9. java实现spark常用算子之ReduceByKey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  10. 1.移动端自动化测试-知识笔记(面试必备,测试点,adb命令)

    移动端测试: 移动应用,特性(功能) 满足 需求(产品文档,隐性需求) 一.App功能测试: 死活背下来1.业务逻辑正确性测试: 产品文档,隐性需求- 写成测试用例 2.兼容性测试:   1.系统版本 ...