HDU-6128 Inverse of sum(二次剩余/公式)
来源:互联网 发布:php分割价格函数 编辑:程序博客网 时间:2024/04/29 15:47
HDU-6128
有
式子推一下可得当且仅当模意义下两数之比为
则比值为
- 模数为2的时候特判,因为有除2操作,需要2的逆元存在。
- 注意
−1+t2=−1+t2 的情况 - 忽略为0的输入
- 模数很大,使用o1乘。
另一种方法是推导到
当
当
下面是第一种方法的代码
#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;}
阅读全文
0 0
- HDU-6128 Inverse of sum(二次剩余/公式)
- HDU 6128 Inverse of sum(二次剩余)
- hdu-6128 Inverse of sum 推公式
- HDU 6128 Inverse of sum(推公式)
- 解题报告:HDU_6128:Inverse of sum (二次剩余)
- HDU 6128 Inverse of sum(数学)
- HDU 6128 Inverse of sum(取模+map处理)
- HDU 3589 二次剩余
- Inverse of sum
- HDU 6128 Inverse of sum(数论)——2017 Multi-University Training Contest
- HDU 6128 Inverse of sum (数论, 2017 Multi-Univ Training Contest 7)
- HDU 3589 Jacobi symbol 【二次剩余】
- hdu 3589(二次剩余+雅可比符号)
- 二次剩余
- 二次剩余
- 二次剩余
- 二次剩余
- [二次剩余]求解二次剩余
- 0816JS
- 关于适配器纹波噪声与主板纹波噪声的问题分析
- caffe Reshape layer 使用
- Git 常用操作
- 【Python爬虫】从零开始玩转爬虫——Top电影信息爬取
- HDU-6128 Inverse of sum(二次剩余/公式)
- Java_[转载总结]之类与对象
- 关系型数据库与非关系型数据库
- 简单背包 记忆化搜索
- 再温暖的鸡汤不如一场殊死的战争,诸神之战四赛区冠军出炉!
- 最简单网络编程之客户端往服务器端送东西03
- React Native 'boost/iterator/iterator_adaptor.hpp' file not found’解决方案
- 69道Spring面试题和答案
- 华为自带浏览器绕坑大法!