首先 m = 1 时 ans = 0
对于 m > 1 的 情况
  由于 1 到 m-1 中所有和m互质的数字,在 对m的乘法取模 运算上形成了群
  ai = ( 1<=a<m && gcd(a,m) == 1 )
  所以 对于 a 必然存在b = a^(-1) = inv(a) 使得 a * b = 1 (mod m)
  这里存在两种情况
  a != b 那么最后的连乘式中a b均出现一次,相乘得1
  a == b 那么最后的连乘式中只出现一个a
  实际上所有 a = inv(a) 的 ai 连乘就是答案
    继续考虑假如 gcd(a,m) == 1 则 gcd(m - a, m) == 1
    记m - a = -a (mod m)
    那么 a * (-a) = - (a*a) = -1 (mod m)
      m != 2时, m - a != a (否则 a = m/2 , gcd(m, m/2) = m/2 != 1)
        所以a 和 -a 总是成对出现
        所以a^2 = 1 (mod m)的解的个数/2 为奇数时,答案为-1,为偶数时 答案为1
      m == 2时,求得答案为1(由于此时1和-1等价,出现了特殊性)
      
      所以对于m > 2的情况,只需求a^2 = 1 (mod m)的解的个数是不是4的倍数

a^2 = 1 (mod m) 等价变换
(a + 1)(a - 1) = 0 (mod m)
假设 m = p0^k0 * p1^k1 * ... * pi^ki (pi为素数)
那么根据中国剩余定理 原方程等价于
方程组 (a + 1)(a - 1) = 0 (mod pi^ki)
  先考虑单个方程:
    pi > 2 时,(a + 1) 和 (a - 1) 必定有一个和pi互质(否则 pi % 2 == 0)
    所以该条方程的解为 ±1 (mod pi^ki)
  
    pi == 2时,
      k == 1时 方程解为 1 (mod 2)
      k == 2时 方程解为 ±1 (mod 4)
      k > 2 方程解为 ±1, (2^(k-1)+1), (2^(k-1)-1) (mod 2^k)
  当方程组只有一条方程时,情况如上所示
  然后考虑多条方程,合并的情况
    根据中国剩余定理,各个式子的各个取值,所有情况在范围内均有且只有一个解
    所以方程组解的个数,就是各个方程解的个数的乘积
m > 2时,解的个数不是4的倍数情况(也就是2)只有以下几种
m = 2^2 = 4
m = p^k (p != 2, 且为素数)
m = 2 * p^k (p != 2, 且为素数)

HDU 4910 HDOJ Problem about GCD BestCoder #3 第四题的更多相关文章

  1. HDU 4910 Problem about GCD 找规律+大素数判断+分解因子

    Problem about GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

    传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131 ...

  3. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  4. hdu 5106 Bits Problem(数位dp)

    题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...

  5. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. hdu 5105 Math Problem(数学)

    pid=5105" target="_blank" style="">题目链接:hdu 5105 Math Problem 题目大意:给定a.b ...

  7. hdu 5381 The sum of gcd(线段树+gcd)

    题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...

  8. Hdu 5445 Food Problem (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online)

    题目链接: Hdu  5445 Food Problem 题目描述: 有n种甜点,每种都有三个属性(能量,空间,数目),有m辆卡车,每种都有是三个属性(空间,花费,数目).问至少运输p能量的甜点,花费 ...

  9. 网络流 HDU 3549 Flow Problem

    网络流 HDU 3549 Flow Problem 题目:pid=3549">http://acm.hdu.edu.cn/showproblem.php?pid=3549 用增广路算法 ...

随机推荐

  1. ES6初识-Proxy和Reflect

    { let obj={ time:'2017-03-11', name:'net', _r:123 };   let monitor=new Proxy(obj,{ // 拦截对象属性的读取 get( ...

  2. Linux Centos 通过虚拟用户访问FTP的配置

    Linux Centos 通过虚拟用户访问FTP的配置 实验需求: 让下面4个虚拟用户使用系统用户ftpvu的权限来连接到Linux FTP服务器,并确保都锁定在 自己的虚拟用户目录,不能切换到其他目 ...

  3. IDEA的使用方法(一)(IDEA基本快捷键)

    一个软件的快捷键显得尤为重要,接下来来讲讲快捷键 CTR+N 搜索类 CTR+SHIT+N 搜索文件 CTR+ALT+空格 代码提示(类似于 ALT+/) ALT+F7 查询在某处使用 CTR+Q 查 ...

  4. JAVAOOP多态

    概念:不同对象对于同一个操作做出的相应不同 实现方法:父类:抽象类 抽象方法 子类:普通类 重写抽象方法 同名 父类:普通类 普通方法 子类:普通类 普通方法 同名 父类:接口 抽象方法 实现类:普通 ...

  5. 为什么C++编译器不能支持对模板的分离式编译

    首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个 ...

  6. linux处理僵尸进程

    由来 在linux下,如果一个进程终止,内核会释放该进程使用的所有存储区,关闭所有文件句柄等,但是,内核会为每个终止子进程保留一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该进程使用的C ...

  7. linux select用法

    select 是linux i/o 复用技术之一 man 2 select #include <sys/select.h> /* According to earlier standard ...

  8. PAT (Basic Level) Practice 1004 成绩排名

    个人练习 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为\ 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行 ...

  9. mybatis中@Param用法

    用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 我们先来看Mapper接口中的@Select方法 package Ma ...

  10. git的使用入门

    写作目的: 快速的上手git版本控制+github神器进行基本的版本同步操作. 怎么做? 对于任意一个代码项目,使用git_bash进入到代码目录 如果没有进行过初始化操作:应当使用git init  ...