题意:
求每个值满足:xa<xb<xc<xd,xb-xa=2(xd-xc),xb-xa<(xc-xb)/3 时作为a,b,c,d物品的出现次数
思路:
1.根据等式得出各数之间的关系-t和k处理 t-枚举 k-值为1 处理成前缀和
d不断增大 对应一组唯一的ab,前一组的ab符合后一组cd
sum+=cnt[a]*cnt[b];
ans[3] [c]+=sum* cnt[d]; ans[4] [d]+=sum*cnt[c];
对应的a和b同理 最后直接输出答案
2.每个魔法值要组合起来 cnt*cnt (用map存)
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int m,n; cin>>n>>m;
vector<int> a(m+1);
vector<vector<int>> ans(5,vector<int> (n+1,0));
unordered_map<int,int> cnt;//记录每个数出现的次数
for(int i=1;i<=m;++i) {
cin>>a[i];
cnt[a[i]]++;//每个魔法值有多少种
}
for(int t=1;9*t+2<=n;++t){//正整数-a-1 k-1 9t+k+a=9t+2
int sum=0;
for(int d=9*t+2;d<=n;++d){
int c=d-t;
int b=c-6*t-1;
int a=b-2*t;
sum+=cnt[a]*cnt[b];//每个组合有多个不同的物品可以组合
ans[3][c]+=sum*cnt[d];//对应的t不同 会有不同的c
ans[4][d]+=sum*cnt[c];
}
sum=0;
for(int a=n-9*t-1;a>=1;--a){
int b=a+2*t;
int c=b+6*t+1;
int d=c+t;
sum+=cnt[c]*cnt[d];
ans[1][a]+=sum*cnt[b];
ans[2][b]+=sum*cnt[a];
}
}
for(int i=1;i<=m;++i)
for(int j=1;j<=4;++j)
cout<<ans[j][a[i]]<<" \n"[j==4];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test=1;
//cin>>test;while(test--)
solve();
return 0;
}