/*
HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2
题意:
给定 m,p, p 是素数
设 f(i) 是 满足 (x+y)^i ≡ x^i mod p 的 (x,y) 对数 且 1 ≤ x ≤ p-1 , 1 ≤ y ≤ m
求 ∑[1≤i≤p-1] i*f(i)
限制: m ≤ p-1, 2 ≤ p ≤ 1e9
分析:
设 g 为 p 的原根,则x,y可表示为 x = g^a, y = g^b
(x+y)^i ≡ x^i (mod p)
(g^a + g^b)^i ≡ g^ai (mod p)
(1 + g^(b-a))^i ≡ 1 (mod p)
设 g^k = 1 + g^(b-a),则 g^ki ≡ 1 (mod p)
则 k 满足 ki % (p-1) == 0 ,即 k 是 (p-1)/gcd(i, p-1) 的倍数
由于 0 < k < p-1 , 则k的取值有 (p-1) / ((p-1)/gcd(i, p-1)) - 1 = gcd(i, p-1)-1 个
回带 1 + y/x = g^k
x = y * (g^k-1)^(-1)
x = y * (g^k-1)^(φ(p)-1)
则 当y固定时, x, k 一一对应,x的取值也有 gcd(i, p-1)-1 个 ans = ∑[1≤i≤p-1] i*f(i)
= ∑[1≤i≤p-1] i * m * (gcd(i, p-1)-1)
= m * ( ∑[1≤i≤p-1] i * gcd(i, p-1) - p*(p-1)/2) 求解 ∑[1≤i≤n] i * gcd(i, n)
= ∑[1≤i≤n] i ∑[k|n] k * [gcd(i, n) == k]
= ∑[k|n] ∑[1≤i≤n] i * k * [gcd(i, n) == k]
= ∑[k|n] k^2 ∑[1≤i≤n/k] i * [gcd(i, n/k) == 1] 求解 ∑[1≤i≤n] i * [gcd(i, n) == 1]
= (∑[1≤i≤n] i * [gcd(i, n) == 1] + ∑[1≤i≤n] (n-i) * [gcd(i, n-i) == 1]) / 2
= ∑[1≤i≤n] (i+n-i)/2 * [gcd(i, n) == 1]
= (n * φ(n) + [n==1]) / 2
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = 1e9+7;
LL phi(LL n) {
LL ans = n;
for (LL i = 2; i * i <= n; i++) {
if (n % i == 0) {
ans -= ans / i;
while (n % i == 0) n /= i;
}
}
if (n > 1) ans -= ans/n;
return ans;
}
LL Cal(LL x, LL n)
{
LL res = 1;
res *= ( (n/x)*phi(n/x) + bool(n/x == 1) ) / 2;
res %= MOD;
res *= x*x % MOD;
res %= MOD;
return res;
}
LL p, m;
int main()
{
int t; scanf("%d", &t);
for (int tt = 1; tt <= t; tt++)
{
scanf("%lld%lld", &m, &p);
LL ans = 0;
for (LL i = 1; i*i <= p-1; i++)
{
if (i*i == p-1)
{
ans += Cal(i, p-1);
ans %= MOD;
}
else if ((p-1)%i == 0)
{
ans += Cal(i, p-1) + Cal((p-1)/i, p-1);
ans %= MOD;
}
}
ans += MOD - p*(p-1)/2 % MOD;
ans = ans % MOD * m % MOD;
printf("Case #%d: %lld\n", tt, ans);
}
}

  

HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2的更多相关文章

  1. HDU 6051 If the starlight never fade(原根+推式子)

    题目大意: 设\(f(i)\)为使\((x+y)^i \equiv x^i (mod\ p)\)成立的(x,y)的对数.其中\(1 \leq x \leq p-1 , 1\leq y\leq m\), ...

  2. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  3. hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4

    题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...

  4. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  5. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  6. 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数

    /** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...

  7. HDU 6300.Triangle Partition-三角形-水题 (2018 Multi-University Training Contest 1 1003)

    6300.Triangle Partition 这个题就是输出组成三角形的点的下标. 因为任意三点不共线,所以任意三点就可以组成三角形,直接排个序然后输出就可以了. 讲道理,没看懂官方题解说的啥... ...

  8. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  9. 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题

    I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 ...

随机推荐

  1. kafka 名词解释及原理解析过程(三)

    为什么要了解这些名词的解释呢?因为在学一个新的知识或者领域的时候,我们需要知道它所定义的概念和名词意思,因为只有这样我们才能理解和掌握这个新的知识点,才能更加系统的掌握这个技术. 一.名词解释 1.b ...

  2. 复合模式MVC

    这里也只说一下简单的原理. Model:模型实现处理数据的切逻辑. View:视图呈现模型的数据和状态. Control:解读视图对模型的操作. 视图和模型之间使用观察者模式,只要模型的状态改变视图立 ...

  3. 【Python基础】12_Python中的容器类型公共方法

    1.Python中的内置函数 注:比较两个值,使用 <. >. == 2.切片 注:字典是一个无序集合,不能切片 3.运算符 字典中的in .not in  对字段操作时,只能判断字典的k ...

  4. linux下mysql启动 Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)

    service mysql start 报错: Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid) ...

  5. java 内部类、匿名内部类

    一:内部类 1:什么是内部类? 大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的 ...

  6. 牛客 216 C 小K的疑惑

    大意: 给定树, 求多少个三元组(i,j,k), 满足dis(i,j)=dis(j,k)=dis(k,i). 刚开始想复杂了, 暴力统计了所有的情况. #include <iostream> ...

  7. linux安装字体库(simSun为例)

    在开发过程中,发现报表打印,字体和默认字体不一样.本地开发环境(windows)没问题,但是远程linux一直出现这样的问题.经过排查发现linux没有安装中文字体库宋体. linux查看当前的字体库 ...

  8. hdu 2189还是dp..

    题目的意思比较简单,类似计数dp. 一开始我想让dp[i]+=dp[i-prime] 每次遍历比i小的所有素数,然后发现有重叠的 比如 2+3 3+2 就导致错误.看了其他人的填充方式,发现定下pri ...

  9. ES6复制数组

    ES6复制数组和合并数组 一.复制数组与合并数组 复制数组:它是复合数据类型,直接复制只是复制了指向底层数据结构的指针,而不是复制一个全新的数组 <!DOCTYPE html> <h ...

  10. Linux学习(二)-Xshell 5和Xftp 5的安装和使用

    (一)软件介绍: (1)Xshell: Xshell通过互联网可以连接到远程的服务器,然后通过模拟终端来实现对服务器的各种操作,而且这款软件可以很好的解决中文乱码问题,非常的方便快捷. (2)Xftp ...