题目链接

Problem Description

There are n nonnegative integers a1…n which are less than p. HazelFan wants to know how many pairs i,j(1≤i<j≤n) are there, satisfying 1ai+aj≡1ai+1aj when we calculate module p, which means the inverse element of their sum equals the sum of their inverse elements. Notice that zero element has no inverse element.

Input

The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.

For each test case:

The first line contains two positive integers n,p(1≤n≤105,2≤p≤1018), and it is guaranteed that p is a prime number.

The second line contains n nonnegative integers a1...n(0≤ai<p).

Output

For each test case:

A single line contains a nonnegative integer, denoting the answer.

Sample Input

2

5 7

1 2 3 4 5

6 7

1 2 3 4 5 6

Sample Output

4

6

题意:

给定一个数组a,找出数组a里面所有的满足当(1≤i<j≤n)是,1/(ai+aj)≡1/ai+1/aj的关系有多少对。

分析:

如果暴力遍历整个a数组的话,因为i,j的位置都需要确定,时间复杂度相当于n^2,肯定会超时,所以想办法将上面的式子进行变形,使之变为在O(n)的时间之内可以确定出来结果。

将式子通分后化简可得(ai2+aj2+ai*aj)%p=0 。

然后等式两边同时乘上(ai-aj),化简可得(ai3-aj3)%p=0。现在的问题就转换为求满足这个关系的对数。

但是直接计算满足这个等式的pair的对数就可以了吗?不是。我们还要考虑到a[i]=a[j]的时候。

当a[i]=a[j]时,(ai2+aj2+aiaj)%p=0 可以转换为(a[i]a[i]+a[i]a[i]+a[i]a[i])%p=0%p(因为p是素数)是不满足条件的,但是我们直接计算上面那个式子会把满足这个关系的式子也算进去,所以我们需要把满足a[i]=a[j]即 3a[i]a[j]>0的这些对数减掉。 这样求出来的才是最终的结果。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int N=1e5+7;
int t,n;
ll p,a[N];
map<ll,int>hsh;
map<ll,int>cnt; ll mul(ll a,ll b)///注意这里并不是整数幂,作用时将a连加b次,返回加后的结果
{
ll an=0;
while(b)
{
if(b&1)an=(an+a)%p;
b>>=1,a=(a+a)%p;
}
return an;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%lld",&n,&p);
hsh.clear();
cnt.clear();
ll ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",a+i);
if(!a[i])continue;
if(mul(mul(a[i],a[i]),3))ans-=cnt[a[i]];///判断3*a[i]*a[i]的值是否大于0,大于的话要把之前加上的全部减去
ll tp=mul(mul(a[i],a[i]),a[i]);///求出的是a[i]^3
ans+=hsh[tp]++;///当前求出的这个tp值可以于之前的所有的相匹配,匹配过后个数再加,下次匹配时的方案数就是这次加过之后的
++cnt[a[i]];///a[i]所对应的值也要更新
}
printf("%lld\n",ans);
}
return 0;
}

2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 3 1003 HDU 6058 Kanade's sum (模拟)

    题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...

  2. 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)

    题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...

  3. 2017ACM暑期多校联合训练 - Team 2 1011 HDU 6055 Regular polygon (数学规律)

    题目链接 **Problem Description On a two-dimensional plane, give you n integer points. Your task is to fi ...

  4. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  7. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  8. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  9. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

随机推荐

  1. Destoon 模板存放规则 及 语法参考

    模板存放规则及语法参考 一.模板存放及调用规则 模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板 模板文件以 .htm ...

  2. P2891 [USACO07OPEN]吃饭Dining(最大流+拆点)

    题目描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she w ...

  3. Now or later UVALive - 3211(2-SAT 最小值最大化)

    emmm...去吃早饭了... rujia讲的很好.. 最小值最大化问题,,,二分枚举答案   设x1.x2为同一个集合中的元素,y1.y2为另一个集合中的元素,如果x1与y1之差小于mid,那么如果 ...

  4. 【POJ1741】Tree(点分治)

    [POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...

  5. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  6. bzoj2396: 神奇的矩阵(矩阵乘法+随机化)

    这题n三方显然会GG... 运用矩阵乘法的性质A*B*R=A*(B*R)=C*R,于是随机化出一个一列的R,就可以把复杂度降低成n方...大概率是不会错的 #include<iostream&g ...

  7. redis搭建集群并用TreeSoft管理

    前言:redis作为一款高效的NOSQL数据库已经深入贯彻和落实到我们的日常开发代码中,作为缓存.时间控制.数据仓库.队列等使用方法层出不穷,简直是开写代码.居家旅行之必备良药.曾经,我们的项目都是单 ...

  8. Spring MVC @RequestParam

    案例来说明 @RequestMapping("user/add") public String add(@RequestParam("name") String ...

  9. signal和sigaction 分析

    1:signal 函数 原型: sighandler_t signal(int signum, sighandler_t handler)      typedef void (*sighandler ...

  10. WPF系列之二:解耦View层控件事件与ViewModel层事件的响应

    以前的做法: 1.当项目的时间比较紧迫的时候,对UI层中控件的事件的处理,往往采取的是类似Winform中最简单的做法,直接做一个事件的Handler直接去调用VM层的方法. 2.控件只有一个Comm ...