zoukankan      html  css  js  c++  java
  • 【BZOJ1406】[AHOI2007] 密码箱(数论水题)

    点此看题面

    大致题意: 给定(n),求所有(x)满足(0le x<n)(x^2equiv1(mod n))

    前言

    日常傻逼题犯傻逼错误,一个许久未见的智障错误今日重出江湖:

    if(n==1) return puts("None");
    

    我居然还认认真真找了半天的数据来(Hack)自己。。。

    大致想法

    显然:

    [x^2equiv1(mod n)Rightarrow x^2-1equiv0(mod n)Rightarrow(x-1)(x+1)equiv0(mod n) ]

    (n=pq(p<q)),则相当于至少要存在一对(p,q)满足(p|(x-1),q|(x+1))(p|(x+1),q|(x-1))

    则我们(O(sqrt n))枚举(p),然后枚举(q)的倍数(显然不到(sqrt n)个,且实际的(p)也只有(sqrt[3]n)个左右)作为(x-1)(x+1),然后相对应去判断(x+1)/(x-1)是否为(p)的倍数即可。

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    using namespace std;
    int n;set<int> s;set<int>::iterator it;
    int main()
    {
    	RI i,j;if(scanf("%d",&n),n==1) return puts("None"),0;s.insert(1),s.insert(n-1);//特判n=1,初始扔入±1的答案
    	for(i=2;1LL*i*i<=n;++i) if(!(n%i)) for(j=n/i;j^n;j+=n/i)//枚举p,q
    		!((j-2)%i)&&(s.insert(j-1),0),!((j+2)%i)&&(s.insert(j+1),0);//判断是否合法
    	for(it=s.begin();it!=s.end();++it) printf("%d
    ",*it);return 0;//迭代器遍历set输出答案
    }
    
  • 相关阅读:
    DFS(深度优先搜索)
    dp动态规划 之 背包问题
    python选择排序的实现
    python冒泡排序实现
    python 数据类型
    SyntaxError: Missing parentheses in call to 'print'
    MFC位图传送错误之一
    SyntaxError :invalid syntax
    Python之命令行参数
    Python之print
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BZOJ1406.html
Copyright © 2011-2022 走看看