[2020.11.3NOIP模拟赛]选数字【容斥】
生活随笔
收集整理的這篇文章主要介紹了
[2020.11.3NOIP模拟赛]选数字【容斥】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/U138404?contestId=36493
題目大意
nnn個數字,每次詢問一個區間有多少個三對數或為xxx。
解題思路
首先顯然這些數都不能有xxx沒有的位數,那么我們選擇的數都得是被xxx包含的,這些數的數量很容易求,但是我們還要求每個111位都得有一個數是111。
那么考慮容斥,如果一個xxx的子集yyy的一的個數是比xxx少kkk,那么容斥系數就是(?1)k(-1)^k(?1)k。然后計算即可。
時間復雜度O(28n)O(2^8n)O(28n)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll n,Q,a[N],f[N][256],g[256]; ll C3(ll x) {return x*(x-1)*(x-2)/6;} int main() {scanf("%lld%lld",&n,&Q);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll j=0;j<256;j++)for(ll i=1;i<=n;i++)f[i][j]=f[i-1][j]+((a[i]|j)==j);g[0]=1;g[1]=-1;for(ll i=2;i<256;i++)g[i]=g[i>>1]*g[i&1];while(Q--){ll l,r,x,ans=0;scanf("%lld%lld%lld",&l,&r,&x);for(ll i=x;i;i=(i-1)&x)ans+=g[x]*g[i]*C3(f[r][i]-f[l-1][i]);printf("%lld\n",ans);} }總結
以上是生活随笔為你收集整理的[2020.11.3NOIP模拟赛]选数字【容斥】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器与路由器4线怎么接4根线的网线如何
- 下一篇: P4867-Gty的二逼妹子序列【平衡结