HDU-6128 Inverse of sum(二次剩余/公式)

二次剩余Cipolla算法学习小记 Preface 今天zz大神给我们讲数论和代数,然后后面讲了几个超级神的算法。CipollaCipolla算是其中一个吧。貌似国内直接查名字还没有什么资料,查二次剩余的算法有ACdreamer简略的介绍。今天听讲时算是听懂了大半,回来又搞鼓了整个晚上才算完全弄明白。这个算法真的是从头到尾都是脑洞,太神了! 详细的解释见维基百科。 Paper 首先我们要弄清楚什么叫二次剩余,其实就是 阅读详情

HDU-6128
有 n 个小于质数p的非负整数a1…n,你想知道有多少对 i,j(1≤i<j≤n)i,j(1≤i<j≤n) ,使得模p意义下 1ai+aj≡1ai+1aj ​即这两数的和的逆元等于它们逆元的和,注意零元没有逆元。 1≤n≤105,2≤p≤1018

式子推一下可得当且仅当模意义下两数之比为 −1+−3√2 或 −1−−3√2 。于是求取 −3对p的二次剩余记为t ,当t不存在时无解. 则 t=−3‾‾‾√modp 即 t2=−3modp 。
则比值为 aiaj=−1±t2 的数对符合要求。对于每一个 aj ,我们找出 ai=−1±t2aj 的数量,就能统计出答案。

  • 模数为2的时候特判,因为有除2操作,需要2的逆元存在。
  • 注意 −1+t2=−1+t2 的情况
  • 忽略为0的输入
  • 模数很大,使用o1乘。

另一种方法是推导到 a2+b2+ab=0
当 a=b时,3a2=0 ,只有p=3时有正数解,且解为 a=1,2
当 a≠b时 ,两边乘 a−b ,得到 a3=b3modp , 查找符合等式的数量即可。

下面是第一种方法的代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+7;

long long mul(long long x,long long y,long long mod) //O1乘
{
    return (x*y-(long long)(x/(long double)mod*y+1e-3)*mod+mod)%mod;
}
long long qpow(long long a,long long b,long long c)
{
    long long r=1;
    while(b)
    {
        if(b&1)
            r=mul(r,a,c);
        b>>=1;
        a=mul(a,a,c);
    }
    return r;
}
long long modsqr(long long a,long long n)//n为质数
{
    long long b,k,i,x;
    a=(a%n+n)%n;
    if(a==0)//a为0时return
        return 0;
    if(n==2)
        return a%n;
    if(qpow(a,(n-1)/2,n)==1)//判断有无二次剩余
    {
        if(n%4==3)//-1是二次非剩余
            x=qpow(a,(n+1)/4,n);
        else
        {
            for(b=1;qpow(b,(n-1)/2,n)==1;b=1+rand()%(n-1));
            i=(n-1)/2;
            k=0;
            do
            {
                i/=2,k/=2;
                if((mul(qpow(a,i,n),qpow(b,k,n),n)+1)%n==0)
                    k+=(n-1)/2;
            }
            while(i%2==0);
            x=mul(qpow(a,(i+1)/2,n),qpow(b,k/2,n),n);
        }
        if(x*2>n)
            x=n-x;
        return x;
    }
    return -1;
}
vector<long long> val;
vector<long long> check;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long n,p,ta;
        scanf("%lld%lld",&n,&p);
        val.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&ta);
            if(ta)
                val.push_back(ta);
        }
        n=val.size();
        long long ans=0;
        if(p==2)
            ans=1ll*n*(n-1)/2;
        else
        {
            long long t=modsqr(-3,p);
            if(t==-1)
            {
                printf("0\n");
                continue;
            }
            long long inv2=(p+1)>>1;
            check.clear();
            check.push_back(mul((-1+p+t)%p,inv2,p));
            check.push_back(mul((-1+p-t)%p,inv2,p));
            sort(val.begin(),val.end());
            if(check[0]==check[1])
                check.pop_back();
            long long tmp;
            for(int i=0;i<n;i++)
            {
               for(auto item:check)
               {
                   tmp=mul(item,val[i],p);
                   ans+=upper_bound(val.begin(),val.begin()+i,tmp)-lower_bound(val.begin(),val.begin()+i,tmp);
               }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
Windows 10下用Python 3搞定Android源码下载:最新repo工具避坑指南 本文详细介绍了在Windows 10系统上,使用Python 3和官方最新repo工具下载Android源码的完整流程。文章提供了从Git安装、环境配置到repo工具初始化、同步加速及常见错误排查的避坑指南,帮助开发者高效搭建稳定的源码下载环境。 阅读详情

相关推荐

OpenFeign, Zuul, Gateway相互不兼容的问题总结

版本 Lib Vresion spring-cloud-starter-gateway 3.1.0 spring-cloud-dependencies 2021.0.0 spring-cloud-starter-netflix-zuul 2.2.6.RELEASE spring-cloud-starter-openfeign 3.1.0 1. Zuul 与OpenFeign 一起使用的问题 错误信息 jav.

Harry的博客 4132

HDU-6128

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6182  这是一道很水很水很水的题。 下面看一下我WA的代码。    由题意很容易得出,此题的极限是15的15次方,所以,以15为极限进行循环,如果发现小于n,则储存I,而后进行输出(当然也可以直接在循环里进行输出)。    所有数据均可过,但是交上去提示WA,这里我直接点出错误的地方,错

Ilovekx的博客 391

CZT与FFT频谱分析方法对比:从任意频带重采样到高精度频谱分析

M = 85 % 输出点数f0 = 70 Hz % 起始频率DELF = 0.4 Hz % 频率步长频率分辨率提高到0.4 Hz分析带宽聚焦在[70, 103.6]Hz更清晰地分辨出78Hz和82Hz的频率分量。

2403_88098319的博客 1860

HDU 6128 Inverse of sum(二次剩余)

Description给nn个小于pp的非负整数a1,...,na_{1,...,n},问有多少对(i,j)(1≤i<j≤n)(i,j)(1\leq i<j\leq n)模pp在意义下满足1ai+aj≡1ai+1aj\frac{1}{a_{i}+a_{j}}\equiv \frac{1}{a_{i}}+\frac{1}{a_{j}},即这两个数的和的逆元等于这两个数的逆元的和,注意0没有逆元Inpu

ZSQ 1085

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

PyTorch+C3D实战:用UCF101数据集训练你的第一个视频动作识别模型(附完整代码)

本文详细介绍了如何使用PyTorch和C3D模型在UCF101数据集上构建视频动作识别系统。从环境配置、数据预处理到模型训练与优化,提供了完整的代码实战指南,帮助开发者快速掌握视频行为识别技术。文章特别强调了3D卷积核设计、混合精度训练等关键技术要点,并分享了模型部署优化经验。

weixin_29233857的博客 218

解题报告:HDU_6128:Inverse of sum (二次剩余)

题目链接 题意及官方题解: 思路: 已知公式: 转换一下: 对于每个y,满足要求的x为: 只需要求的y的系数在(%mod)意义下的等价式即可 等同于求sqrt(-3)的等价式,也就是求p-3在(%mod)意义下的二次剩余( Cipolla's algorithm ) 注意一些细节:不考虑0、mod=2、mod=3、x==y时的计数 以及 不存在p-3

Hee的博客~ 453

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4410

hdu-6128 Inverse of sum 推公式

http://acm.hdu.edu.cn/showproblem.php?pid=6128  很好懂得博客:http://blog.youkuaiyun.com/dormousenone/article/details/77340852   想到乘一个ai-aj真的太强了。。。。。 然后用map注意下重复的元素,搞一搞就可以了 #include using namespace std; long l

jerans的博客 447

手把手教你学Simulink——基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的PR(比例谐振)控制器在单相整流系统中的应用。通过与传统PI控制器的对比,阐述了PR控制器在交流信号跟踪中的优势:可实现50Hz正弦电流的无静差跟踪,THD低于2%,功率因数接近1。文章从PR控制器原理出发,提供了Simulink建模的具体步骤,包括主电路搭建、电压外环设计、PR控制器实现方法(推荐MATLAB Function方式)以及SPWM调制。通过仿真验证了PR控制在稳态和负载突变情况下的优越性能,并探讨了工程实践中的电网频率自适应、多谐振PR等关键技术。该教程为

MHD0815的博客 123

极智AI | 详解 ViT 算法实现

大家好,我是极智视界,本文详细介绍一下 ViT 算法的设计与实现,包括代码。

极智视界 5604

HDU 6128 Inverse of sum(数论)——2017 Multi-University Training Contest - Team 7

传送门 Inverse of sumTime Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 326    Accepted Submission(s): 112Problem Description There are nn nonnegati

代码改变世界 1536

c语言实现求一个矩阵特征值和特征向量

前言 求矩阵的特征值,主要是用的QR分解,在我的有一次博客里,我已经详细地给出了计算的过程,大家有兴趣可以去看下,经过几天的钻研,终于完成了整个的eig算法。下面我将把我的整个代码附上,有不懂的可以问我,欢迎一起讨论学习! 这是对上一次的修改版,上一次写的程序是在C++编译环境下编译的,所以放在c里面编译有些会出错。 最后,如果有不对的地方希望大...

qq_36417014的博客 2万+

hdu6128 Inverse of sum

数学题

ACoder 248

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6128 题意:给你n个数,问你有多少对i,j,满足i<j,并且1/(ai+aj)=1/ai+1/aj在%p意义下。 解法:官方题解说是用二次剩余来解,但是我并不会这玩意了。在网上看到一位大佬没有二次剩余直接通过推公式做出了这题,真是神奇。http://www.cnblogs.com...

aishangg437965的博客 138

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

hdu 6128 Inverse of sum(推公式)

题目链接:hdu 6128 Inverse of sum 题意: 给你n个数,问你有多少对i,j,满足i<j,并且1/(ai+aj)=1/ai+1/aj在%p意义下。 题解: 不愧是高中生,推公式神题。 将式子通分化简后可得(ai2+aj2+ai*aj)%p=0。 然后两边同时将两边乘(ai-aj),化简可得(ai3-aj3)%p=0。 然后就可以用map记录一下个数,并且减...

weixin_30336061的博客 177

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学--数论--HDU 6128 Inverse of sum (公式推导论)

Description 给nn个小于pp的非负整数a1,…,na1,…,n,问有多少对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)模pp在意义下满足1ai+aj≡1ai+1aj1ai+aj≡1ai+1aj,即这两个数的和的逆元等于这两个数的逆元的和,注意0没有逆元 Input 第一行一整数TT表示用例组数,每组用例首先输入一整数nn表示序列长度和一素数pp表示模数,之后输入...

日拱一卒,功不唐捐 2937

HDU 6128 Inverse of sum(推公式)

Inverse of sumTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 657 Accepted Submission(s): 223Problem Description There are n nonnegative

ftx456789的博客 368

HDU 6128 Inverse of sum (数论, 2017 Multi-Univ Training Contest 7)

ProblemThere are n nonnegative integers a1…n which are less than p. HazelFan wants to know how many pairs i,j(1≤iIdea⟺⟺⟺1ai+aj≡1ai+1aj1ai+aj≡ai+ajai⋅ajai⋅aj≡(ai+aj)2a2i+ai⋅aj+a2j≡0modpmodpmodpmodp(1)(2

DorMOUSENone的博客 853

HDU 6128 Inverse of sum(数学)

HDU 6128 (数学计算) 2017ACM暑期多校联合训练 - Team 7 1009 Inverse of sum题目链接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

南风古 617

hdu 3589(二次剩余+雅可比符号)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3589; 题意:就是一个裸的雅可比符号: 代码如下: #include #include #include #include using namespace std; int a[10]; int fac[100500],sum[100500]; int cnt;

北门的智慧 2585

HDU 6128(乱搞)

Problem Description There are n nonnegative integers a1…n which are less than p. HazelFan wants to know how many pairs i,j(1≤ij≤n) are there, satisfying 1ai+aj≡1ai+1aj when we calculate mod

baidu_35522092的博客 415

HDU 4794 Arnold ACM/ICPC 2013 Changsha(二次剩余+数论)

看了这么久,居然不是找规律的题目……         大致题意是给你一个N*N的矩阵,然后告诉你阿诺德变换,即原来坐标为(x,y)的点变换一次后变成((x+y)%N,(x+2y)%N)。然后告诉你阿诺德变换一定能够通过有限次变换之后变换回原本的矩阵,然后让你求这个周期。         我们用(x,y)的形式表示每一个坐标,写出经过阿诺德变换之后的坐标。我们发现,对于坐标(x,y),经过有阿诺德变换之后,在模n的剩余系下可以写成(fib(n)x+fib(n+1)y,fib(n+1)x+fib(n+2)y)的

alpc_qleonardo 1305

HDU6128 Inverse of sum

题目链接题意​ 存在一个长度为 nn 非负数列 AA ,满足条件 ai<qa_i < q 。求存在多少对 i,j(1≤i<j≤n)i,j(1\leq i<j\leq n) 满足 1ai+aj≡1ai+1ajmodp\frac{1}{a_i+a_j} \equiv \frac{1}{a_i}+\frac{1}{a_j} \mod p ,即和的逆元与逆元的和同余。分析​ 题目中已经提示了0没有逆

dDarkdawn的博客 966

HDU - 6128

题意略: 题解:二次剩余板子题 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimiz...

weixin_30817749的博客 151

hdu6128 Inverse of sum 2017多校第七场1009 数学

hdu6128 Inverse of sum 2017多校第七场1009 数学 http://acm.hdu.edu.cn/showproblem.php?pid=6128 题意:给出数组,求数组中有多少数对满足1/(a+b)=1/a+1/b(两边模p)。 代码我是参考:http://blog.youkuaiyun.com/ddarkdawn/article/details/77248602 题解:化简有:a*a+a*b+b*b=0(mod p).两边同乘(a-b),有a^3-b^3=0(mod p)。所以记录每个数字

ACZone 382
上一篇: HDU-6057 Kanade's convolution(多项式FWT)
下一篇: HDU-4899 Hero meet devil(DP套DP)
lanvent
博客等级 码龄11年 1粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值