给定一个数列$a_1,a_2,...,a_n$,支持两种操作 1 l r x,猜测数列中[l,r]位置上的数的最大公约数$x$,判断这个猜测是否是接近正确的.如果我们可以在数列[l,r]位置中改动至多一个数使得它们的最大公约数是x,那么这个猜测就被认为是接近正确的(注意我们不需要在数列中进行实际的改动).如果这个猜测是接近正确的,输出"YES",否则输出"NO"(都不含引号). 2 i y,将$a_i$的数值改为y. 如果这一段区间有超过一个数不是$x$的倍数就不行…
嗯~~,好题... 用线段树维护区间gcd,按如下法则递归:(记题目中猜测的那个数为x,改动次数为tot) 1.若子区间的gcd是x的倍数,不递归: 2.若子区间的gcd是x的倍数,且没有递归到叶子结点,那么向下递归 3.若递归到叶子结点,说明这个数需要改动,++tot 4.若在任意时刻有tot>1,则直接return(不符题意) #include<cstdio> #include<iostream> #define ll long long #define R regist…
Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹.數論) 今天我們來看看CF914D 題目連結 題目 給你一個長度為\(n\)的數列\(a\),每次玩家會選擇一個區間猜\(g.c.d.\)的值,或者改變數列中的某個數字.而猜中不一定要完全準確,如果玩家能夠改動一個區間中的數字讓\(g.c.d.\)完全猜中也是可以的. 前言 我對線段樹還是不熟阿,一開始一直感覺\(g.c.d.\)沒辦法用線段樹維護... 想法 上模板,從維護區間和的模板改成…
D. Bash and a Tough Math Puzzle http://codeforces.com/contest/914/problem/D 题意: 单点修改,每次询问一段l~r区间能否去掉小于等于1个数,使gcd为x 分析: 线段树. 线段树二分.如果一边的gcd不是x,那么递归这一边,找到这个位置为止,计算这样的位置的个数. 代码: #include<cstdio> #include<algorithm> #include<cstring> #includ…
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变一个数的值(注意不是真的改变),使得这个区间的gcd是小明所猜的数也算小明猜对.另一种操作就是真的修改某一点的值. 解题思路 这里我们使用线段树,维护区间内的gcd,判断的时候需要判断这个区间的左右子区间的gcd是不是小明猜的数的倍数或者就是小明猜的数,如果是,那么小明猜对了.否则就需要进入这个区间…