[计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
2017-07-11 17:48
543 查看
因为要选6根木棒,发现肯定是1,1,2,2或1,1,1,3形式。
可以枚举2和3的部分,然后推一推,容斥容斥就可以了
但是细节贼多
可以枚举2和3的部分,然后推一推,容斥容斥就可以了
但是细节贼多
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int N=5010,MAX=1e7; typedef long long ll; int n,a ; ll num[MAX+10],dnum[MAX+10],vis[MAX+10],ans; vector<int> b; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void rea(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc()); } int main(){ rea(n); for(int i=1;i<=n;i++){ rea(a[i]),num[a[i]]++; if(!vis[a[i]]) b.push_back(a[i]); vis[a[i]]=1; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i]+a[j]<=MAX && a[i]<a[j]) dnum[a[i]+a[j]]++; for(int u : b) if(num[u]>=2){ ll x=1LL*num[u]*(num[u]-1)/2,cur=0; if(u%2==0 && num[u/2]>=4) ans+=x*num[u/2]*(num[u/2]-1)*(num[u/2]-2)*(num[u/2]-3)/24; for(int v : b) if(v<u && num[v]>=2 &&num[u-v]>=2 && v<u-v) cur+=num[v]*(num[v]-1)*num[u-v]*(num[u-v]-1)/4; ans+=x*cur; cur=0; for(int v : b) if(v<u && num[u-v] && v<u-v) ans+=x*cur*num[v]*num[u-v],cur+=num[v]*num[u-v]; if(u%2==0) ans+=x*cur*num[u/2]*(num[u/2]-1)/2; } for(int u : b) if(num[u]>=3){ ll x=1LL*num[u]*(num[u]-1)*(num[u]-2)/6,cur=0; if(u%3==0 && num[u/3]>=3) ans+=x*num[u/3]*(num[u/3]-1)*(num[u/3]-2)/6; for(int v : b) if(v<u){ cur+=1LL*num[v]*dnum[u-v]; if(v+v<u && v+v+v!=u ) cur-=1LL*num[v]*num[v]*num[u-v-v]; } ans+=cur*x/3; for(int v : b) if(v*3!=u && v*2<u) ans+=x*num[v]*(num[v]-1)/2*num[u-v-v]; } printf("%lld\n",ans); return 0; }
相关文章推荐
- [树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [bzoj4927][SDOI省队集训2017]diyiti
- [LOJ#6060][线性基]2017 山东一轮集训 Day1. Set
- [Hall定理 + 线段树] LibreOJ#6062. 「2017 山东一轮集训 Day2」Pair
- LOJ #6062. 「2017 山东一轮集训 Day2」Pair
- [主席树 链剖] LOJ#6073. 「2017 山东一轮集训 Day5」距离
- [倍增NTT][DP] LOJ#6059. 「2017 山东一轮集训 Day1」Sum
- loj6100 「2017 山东二轮集训 Day1」第一题
- [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
- LibreOJ 6#6062. 「2017 山东一轮集训 Day2」Pair
- [霍尔定理]「2017 山东一轮集训 Day2」LOJ 6062——PAIR
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
- LOJ 6100 「2017 山东二轮集训 Day1」第一题
- LOJ.6062.[2017山东一轮集训]Pair(Hall定理 线段树)