1. 程式人生 > >【Luogu P3794】簽到題IV

【Luogu P3794】簽到題IV

題目連結

題目描述

給定一個長度為n的序列a1,a2…an其中每個數都是正整數。
你需要找出有多少對(i,j),
1ijn1\leq i\leq j \leq ngcd(ai,ai+1...aj)xor(aiorai+1or...oraj)=kgcd(a_i,a_{i+1}...a_j) xor (a_i or a_{i+1} or ... or a_j)=k其中xor表示二進位制異或,or表示二進位制或。

Sol

顯然我們會發現一個性質:
假設我們固定一個左端點然後往後掃右端點 , gcd是單調不升的 , 或和 是單調不降的

這個可以用來二分合法區間 , 但比較麻煩

考慮一個更加優秀的性質:
對於一個最大值為 X 的序列gcd最多隻有 logX 種 , 因為每次更改gcd這個數至少會除掉2
類似的,對於一個最大值為 X 的序列 OR和 也最多隻有 logX 種 , 因為每次更改或和這個數的二進位制至少會增加一個 1

這個就可以用來暴力了

考慮CDQ分治 , 對於過中點的區間 , 暴力把左右兩邊不同的gcd和or都摳出來,然後平方匹配

複雜度好像很多個log…

#include<iostream>
#include<cstdio>
#include<cstring>
#include
<cstdlib>
#include<algorithm> #include<queue> #include<set> #define gcd GCD #define log LOG using namespace std; const int N=5e5+10; typedef long long ll; inline int gcd(int a,int b){return b? gcd(b,a%b):a;} inline int read() { int x=0;char ch=getchar();int t=1; for(;ch>'9'
||ch<'0';ch=getchar()) if(ch=='-') t=-1; for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48); return x*t; } int w[N];int n,k; ll ans=0; int G[N],O[N];int num1[N],num2[N],dat1[N],dat2[N]; void Div(int l,int r) { if(l>r) return; if(l==r) return (void)(k? ans=ans:ans=ans+1); int mid=l+r>>1; Div(l,mid);Div(mid+1,r); for(int i=l;i<=r;++i) G[i]=O[i]=w[i]; int cnt1=1,cnt2=1; num1[cnt1]=1;num2[cnt2]=1; dat1[cnt1]=mid;dat2[cnt2]=mid+1; for(int i=mid-1;i>=l;--i) { G[i]=gcd(G[i],G[i+1]),O[i]|=O[i+1]; if(G[i]==G[i+1]&&O[i]==O[i+1]) ++num1[cnt1]; else num1[++cnt1]=1,dat1[cnt1]=i; } for(int j=mid+2;j<=r;++j) { G[j]=gcd(G[j],G[j-1]),O[j]|=O[j-1]; if(G[j]==G[j-1]&&O[j]==O[j-1]) ++num2[cnt2]; else num2[++cnt2]=1,dat2[cnt2]=j; } for(int i=1;i<=cnt1;++i){ for(int j=1;j<=cnt2;++j){ if((gcd(G[dat1[i]],G[dat2[j]])^(O[dat1[i]]|O[dat2[j]]))==k) ans+=1ll*num1[i]*num2[j]; } } return; } int main() { n=read();k=read();bool flag=1; for(int i=1;i<=n;++i) {w[i]=read();if(w[i]!=w[1]) flag=0;} if(flag){ if(k) puts("0"); else printf("%lld\n",1ll*(n-1)*n/2+n); return 0; } return Div(1,n),printf("%lld\n",ans),0; }

相關推薦

Luogu P3794簽到IV

題目連結 題目描述 給定一個長度為n的序列a1,a2…an其中每個數都是正整數。 你需要找出有多少對(i,j), 1≤i≤j≤n1\leq i\leq j \leq n1≤i≤j≤n 且gcd(ai,ai+1...aj)xor(aiorai+1or...oraj

luogu P1613跑路

== 數組 pro nbsp 推出 for cst fine return https://www.luogu.org/problem/show?pid=1613 看到2k就能想到倍增。用一個數組avai[i][j][k]表示點i與點j是否存在長2k的路徑,則可以遞推出av

luogu 1177模板快速排序

sin 之一 快速排序 包含 names space 整數 -- 說明 題目描述 利用快速排序算法將讀入的N個數從小到大排序後輸出。 快速排序是信息學競賽的必備算法之一。對於快速排序不是很了解的同學可以自行上網查詢相關資料,掌握後獨立完成。(C++選手請不要試圖使用ST

luogu 3366模板最小生成樹

接下來 class deep 兩個 生成樹 生成 last 模板 blog 題目描述 如題,給出一個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,表示該圖共有N個結點和M條無向邊。(N<=5000,M

luogu 3383模板線性篩素數

100% put pre esp log main col i++ 每一個 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接

luogu 3382模板三分法

include 表示 時空 return 三分 %d color upload printf 題目描述 如題,給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 輸入輸出格式 輸入格式: 第一行一次包含一個

luogu 3865模板ST表

cnblogs ios ram efi turn char 說明 iostream line 題目背景 這是一道ST表經典題——靜態區間最大值 請註意最大數據時限只有0.8s,數據強度不低,請務必保證你的每次查詢復雜度為 O(1)O(1) 題目

luogu 3375模板KMP字符串匹配

col 100% while turn tdi 技術分享 其中 限制 分享 題目描述 如題,給出兩個字符串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。 為了減少騙分的情況,接下來還要輸出子串的前綴數組next。 (如果你不知道這是什麽意思也不要問

luogu 3811模板乘法逆元

bottom sel ram font mat 一行 msu set scrip 題目背景 這是一道模板題 題目描述 給定n,p求1~n中所有整數在模p意義下的乘法逆元。 輸入輸出格式 輸入格式: 一行n,p 輸出格式: n行,第i行表示i在模p意義下的逆元

luogu 3372模板線段樹1

-- 含義 return pri 一行 一個數 code update upload 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數

Luogu P1135 奇怪的電梯

sam pop 個數 電梯 http ipo zhang pan .cn 題目描述 呵呵,有一天我做了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓(1<=i<=N)上有一個數字Ki(0<=Ki<=N)。電梯只有四個按鈕:開

Luogu P2592 [ZJOI2008]生日聚會

疑問 ostream n) 找到 輸入格式 names 超過 條件 pan 題目描述 今天是hidadz小朋友的生日,她邀請了許多朋友來參加她的生日party。 hidadz帶著朋友們來到花園中,打算坐成一排玩遊戲。為了遊戲不至於無聊,就座的方案應滿足如下條件: 對於任意連

OCP|052OCP庫更新,052最新考題及答案整理-第10

action media recovery about arc cover pen shutdown data 10、Which two are true about consistent database backups? A) They can only be take

leetcode 簡單第二 反轉整數

根據 code 註意 nbsp 輸出 bsp turn res reverse 給定一個 32 位有符號整數,將整數中的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21

luogu題解P1546 最短網絡 Agri-Net

消費 scanf color 長度 題解 += node clas using 題目   約翰已經給他的農場安排了一條高速的網絡線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連接所有的農場。 你將得到一份各農場之間連接費用的列表,你必須找出能

Luogu P1502 視窗的星星

→傳送視窗 (複製一下題面好了~) 題目背景 小卡買到了一套新房子,他十分的高興,在房間裡轉來轉去。 題目描述 晚上,小卡從陽臺望出去,“哇~~~~好多星星啊”,但他還沒給其他房間設一個窗戶,天真的小卡總是希望能夠在晚上能看到最多最亮的星星,但是窗子的大小是固定的,邊也必須和地面平行。這時小卡使

軟考下午 解題思路總結

總:      下午題就是閱讀理解題,考察的是對題幹資訊的理解總結能力。 分: 試題一 考察資料流圖 1-3題    (寫實體名,資料儲存,補充缺失的資料流及其起點和終點。)可以一起做。 方法: 在加工的描述文字

Luogu 4178Tree

col play 我們 hide nbsp spa esp 前綴 樹狀 Tree 點分治   題目鏈接:https://www.luogu.org/problemnew/show/P4178   對於點分治,我們每次處理一個重心的時候:     用b數組存這個重心處理到

BZOJ 3687簡單

題目描述 小呆開始研究集合論了,他提出了關於一個數集四個問題: 1.子集的異或和的算術和。 2.子集的異或和的異或和。 3.子集的算術和的算術和。 4.子集的算術和的異或和。 目前為止,小呆已經解決了前

Luogu P1981表示式求值

點我進入原題Luogu P1981 【解題思路】 仔細分析題目,這就是一道模擬題…… 直接按照符號讀入全部的數字,先算乘法,最後把全部數加起來就是結果了 記得要%10000取最後四位 【參考程式】 #i