bzoj

BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset

你。 提交于 2020-02-23 08:07:31
题解: 求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式: $A[i]ans+p[i]y=b[i],$ 直接求 $ans$ 的正整数解即可. 增量 $M$ 为 $\frac{p[i]}{gcd(A[i],p[i])}$ 那如果有多个式子呢 $?$ 假设前面的式子得到的最小解为 $ans,$ 增量为 $M.$ 考虑将当前求出的 $ans',M'$ 与 $ans$ 合并. 即 $ans+M\times x=ans'+M'\times y\Rightarrow Mx-M'y=ans'-ans.$ 这个可以再用一次 $exgcd$ 解出来,然后新的增量为 $lcm(M,M')$. 主要就是这些,然后有一些细节和特判需要特别注意一下. #include <set> #include <cstdio> #include <string> #include <algorithm> #define N 200000 #define ll long long #define ull unsigned long long using namespace std; void setIO(string s) { string in=s+".in",out=s+".out"; freopen

bzoj 2480——扩展BSGS

馋奶兔 提交于 2020-02-23 08:04:21
题意 给定 $a,b$ 和模数 $p$,求整数 $x$ 满足 $a^x \equiv b(mod \ p)$,不保证 $a,p$ 互质。 (好像是权限题,可见 洛谷P4195 分析 之前讲过,可以通过设置 $x = km - r$ 而非 $x = km + r$ 避免求逆元,但是需要逆元存在,$a, p$ 互质的条件保证了这一点。 如果 $a, p$ 不互质怎么办呢? 我们想办法让他们变得互质。 具体地,设 $d_1 = gcd(a, p)$,如果 $d_1 \nmid b$,则原方程无解。否则我们把方程同时除以 $d_1$,得到 $$\frac{a}{d_1}\cdot a^{x-1} \equiv \frac{b}{d_1} \ mod (\frac{p}{d_1})$$ 如果 $a$ 和 $\frac{p}{d_1}$ 仍不互质就再除,设 $d_2=gcd(a, \frac{p}{d_1})$。如果 $d2 \nmid \frac{b}{d_1}$,则方程无解;否则同时除以 $d_2$ 得到 $$\frac{a^2}{d_1d_2}\cdot a^{x-2} \equiv \frac{b}{d_1d_2} \ mod(\frac{p}{d_1d_2})$$ 这样不停地判断下去,直到 $a \perp \frac{p}{d_1d_2...d_k}$。 记 $D = \prod_

洛谷 P3338 【ZJOI2014】力/BZOJ 3527 力 题解

一世执手 提交于 2020-02-17 18:58:15
洛谷 P3338 【ZJOI2014】力 / BZOJ 3527 力 题解 题意 给定一个正整数 \(n(1\leq n\leq 10^5)\) ,以及有 \(n\) 个元素的浮点数序列 \(q(0<q_i<10^9)\) .要求对于所有的 \(i\in [1,n]\) ,输出 \[ E_j=\sum_{i=1}^{j-1}\frac{q_i\times q_j}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i\times q_j}{(i-j)^2} \] 注:当你输出的答案与标准答案相差不超过 \(10^{-2}\) 时,即视为答案正确. 题解 显然,暴力是行不通的,所以考虑使用 \(FFT\) 进行卷积来处理. 首先考虑序列能进行卷积所要满足的条件: \[ c_i=\sum_{j=0}^ia_j\times b_{n-j} \] 所以我们必须要把原式变得好看一点才能进行卷积. 我们不妨令 \(a_i=q_i,b_i=\frac{1}{i^2}\) ,那么可以对原式进行一下变形: \[ E_j=\sum_{i=1}^{j-1}\frac{q_i\times q_j}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i\times q_j}{(i-j)^2} =\sum_{i=1}^{j-1}a_ib_{j-i}-\sum_{i=j+1}^{n}a

BZOJ 4403: 序列统计(lucas)

二次信任 提交于 2020-02-15 23:53:44
传送门 题目是给你m个数字,让你求1~n个数分别能构成的单调不降序列的个数的和且模一个1e6+3 对于这道题,我们先考虑n个人,然后我们把m个数字分给n个人,但是会有有人分不到的情况,所以我们假设每人都能分到 这样我们的总个数就变成了n+m个数字分给m个人,这样我们用隔板法能得到C(m-1,n+m-1) 然后总和就是n取1~n个组合数加起来,然而组合数有一个公式是C(m,n)=C(m,n-1)+C(m-1,n-1) 又由于C(m,m)=1,即C(m,1+m-1)=1,与C(m-1,m)合并后为C(m,m+1) 然后我们给整体总和的式子加1,化简就能得到C(m,n+m)-1 AC代码如下: # include <bits/stdc++.h> # define int long long using namespace std ; const int mod = 1e6 + 3 ; int fac [ mod + 10 ] , ifac [ mod + 10 ] , n , l , r , t ; ; inline long long C ( int n , int m ) { if ( m > n ) return 0 ; return ( fac [ n ] * ifac [ fac [ m ] ] ) % mod * ifac [ fac [ n - m ] ] % mod ;

[bzoj 3155] Preprefix sum

ε祈祈猫儿з 提交于 2020-02-15 06:56:50
[bzoj 3155] Preprefix sum Description Input 第一行给出两个整数N,M。分别表示序列长度和操作个数 接下来一行有N个数,即给定的序列a1,a2,….an 接下来M行,每行对应一个操作,格式见题目描述 Output 对于每个询问操作,输出一行,表示所询问的SSi的值。 Sample Input 5 3 1 2 3 4 5 Query 5 Modify 3 2 Query 5 Sample Output 35 32 HINT 1<=N,M<=100000,且在任意时刻0<=Ai<=100000 唉,这题可以维护系数做,也可以直接用线段数搞.这里我用简单的方法,直接搞!我们直接维护sum[i]的值,那么询问pos相当于区间 \([1,pos]\) 的sum和.修改A[i]也好办,区间修改i~n的sum值就行了,改成加法的操作,就可以上线段树.不过也可以用拆一下SSi来用树状数组维护一下系数.有点麻烦,我不讲了.但是这里我用树状数组代替了线段树执行区间修改和区间查询的操作,至于这个是怎么来的,其实也有点像之前那个维护系数的方法,用差分的思路去做就好了. #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; static const int

[BZOJ 3155] Preprefix sum

让人想犯罪 __ 提交于 2020-02-15 00:54:06
Description 前缀和(prefix sum) \(S_i=\sum_{k=1}^i a_i\) 。 前前缀和(preprefix sum) 则把 \(S_i\) 作为原序列再进行前缀和。记再次求得前缀和第 \(i\) 个是 \(SS_i\) 。 给一个长度 \(n\) 的序列 \(a_1, a_2, \cdots, a_n\) ,有两种操作: Modify i x :把 \(a_i\) 改成 \(x\) ; Query i :查询 \(SS_i\) 。 Input 第一行给出两个整数 \(N,M\) 。分别表示序列长度和操作个数; 接下来一行有 \(N\) 个数,即给定的序列 \(a_1,a_2,\dots,a_n\) ; 接下来 \(M\) 行,每行对应一个操作,格式见题目描述。 Output 对于每个询问操作,输出一行,表示所询问的 \(SS_i\) 的值。 Sample Input 5 3 1 2 3 4 5 Query 5 Modify 3 2 Query 5 Sample Output 35 32 HINT \(1\le N,M\le100000\) ,且在任意时刻 \(0\le A_i\le100000\) Solution \[ \begin{eqnarray} SS_i&=&\sum_{j=1}^{i}\sum_{k=1}^{j}a_k\\ &=&\sum

BZOJ 2730 矿场搭建 割点

試著忘記壹切 提交于 2020-02-14 18:16:25
一、内容 矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。 Input 输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。 Output 输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。 Sample Input 9 1 3 4 1 3 5 1 2 2 6 1 5 6 3 1 6 3 2 6 1 2 1 3 2 4 2 5 3 6 3 7 0 Sample

趣味神题

最后都变了- 提交于 2020-02-13 07:47:19
趣味神题 luoguP2717 寒假作业 我没想到,我太菜了。。。。 把所有的 \(a_i\) 减去k,那么只要满足 \(\sum_{i=l}^ra_i > 0\) 即为平均数大于k. 造一个前缀和. 然后求贡献就可以了 Loj 505 ZQC的游戏 先让ZQC吃点他范围内的所有食物 然后网络流限流即可. 如果不满流,输出NO 否则输出YES. 待填坑 bzoj 1802 跳棋 bzoj 3513 idiots CF 852E Casions and travel CF 900D Unusual Sequences ZROI 251导数卷积 CF 949E Binary Cards LOJ 6085 优惠券 [POI2014]Rally 洛谷 3924 康娜的线段树 来源: https://www.cnblogs.com/gzygzy/p/10321418.html

BZOJ #5457: 城市 [线段树合并]

半城伤御伤魂 提交于 2020-02-11 20:57:55
线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, j, n) for (int i = j; i <= n; i++) #define in cin #define out cout #define pii pair<int, int> #define fir first #define sec second int n, m; const int maxn = 4e5 + 54; int rt[maxn], ls[maxn << 5], rs[maxn << 5], cnt = 0; pii mx[maxn << 5], ans[maxn]; void upd(int& p, int l, int r, int x, int v) { if (!p) p = ++cnt; if (l == r) { mx[p] = { v, -x }; return; } int mid = l + r >> 1; if (x <= mid) upd(ls[p], l, mid, x, v); else upd(rs[p], mid + 1, r, x, v); mx[p] = max(mx[ls[p]], mx[rs[p]]); } int

[算进] BZOJ 2818(欧拉函数)

情到浓时终转凉″ 提交于 2020-02-10 14:41:56
Problem ACwing 题目地址 BZOJ 题目地址 Solution 一眼莫反, 许多年前好像用莫反做过 。但是在其他大佬的博客里Get到了一种用欧拉函数的快速算法,写一下。 定理 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=1] = (\sum_{i=1}^n 2*φ(i)) - 1\] 很好理解。减去的 \(1\) 是多算的一个 \((1,1)\) 。 让后就可以切爆这题了。 Code Talk is cheap.Show me the code. #include<bits/stdc++.h> #define int long long using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x * f; } const int N = 1e7+7; int n,tot,ans; int phi[N],p[N],sum[N]; bool vis[N]; void MakePhi() {