给定 ,求当 时满足以下条件的有序三元组 的数量:
.
.
,.
分别求 时的答案 .对于枚举的每一个 ,枚举 ,这样可以得到 .
考虑预处理 表示满足 的有序对 的个数. 这个可以枚举两个数,然后将它们乘积的余数对应的 值 . 这样对于枚举的 ,直接将 加上 即可.
不过 可能计算了 去乘上某个数,因此还要预处理 ,表示满足 的 的个数. 这个可以枚举 两个数,然后然后将它们乘积的余数对应的 值 .
最后再把 减去 即可. 注意是 倍,因为 的值是有序对个数,当 时都要减去 .
时间复杂度为 ,空间复杂度为 ,可以接受.
点击查看代码
#include<bits/stdc++.h>
#define int long long//相乘会见祖宗.
#define N 5001
using namespace std;
int u[N][N],v[N],p,n,a[N];
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin>>n>>p;
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i^j){
++v[a[i]*a[j]%p];
++u[i][a[i]*a[j]%p];
}
}
}
for(int i=0,k;i<p;++i){
k=0;
for(int j=1,q;j<=n;++j){
q=(i-a[j]+p*1145141919810)%p;//注意负数取模.
k+=v[q]-u[j][q]*2;
}
cout<<k<<' ';
}
}