牛客国庆集训派对Day5 Solution】的更多相关文章

A    璀璨光滑 留坑. B    电音之王 蒙特马利大数乘模运算 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long u64; typedef __int128_t i128; typedef __uint128_t u128; struct Mod64 { Mod64() :n_() {} Mod64(u64 n) :n_(init(n)) {} st…
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < p - a[i]\) 做法 神仙容斥,太妙啦 首先考虑存在\(a[i] = 0\)时,其它数可任意选 枚举哪些位置违反条件进行容斥 列出式子发现,这简直就是二项式分解! 但当所有位置都违反时,不存在可能的解,所以需要把它剪掉,这也就是数据小于1e5的原因,简直太神奇了!…
A    矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 int n, p, m; ], b[][N], ans[N][N]; void Run() { while (scanf("%d%d%d", &n, &p, &m) != EOF) { ; i <= n; ++i) ; j <= p; ++j) scanf(…
A    深度学习 puts(n) #include <bits/stdc++.h> using namespace std; int main() { double n; while (scanf("%lf", &n) != EOF) printf("%.10f\n", n); ; } B    异或求和 思路:  有一个$O(nlogn^2)$ 的做法,但是T了. 设$bit(x, i)$为 x在二进制下第i位为1还是0 考虑 $\sum_{…
题目描述 终于活成了自己讨厌的样子. 这是她们都还没长大的时候发生的故事.那个时候,栗子米也不需要为了所谓的爱情苦恼. 她们可以在夏日的午后,花大把的时间去研究生活中一些琐碎而有趣的事情,比如数论. 有一天西柚柚问了栗子米一个题,她想知道中有多少不同的数,这些不同的数字里面第k大的是多少. 输入描述: 第一行一个整数T(T≤ 10 5 ),表示数据组数.每组数据第一行两个整数,表示n,k(1≤ n≤ 10 18 ),保证k不会超过不同的数字个数. 输出描述: 对于每组数据输出,输出两个整数,表示…
A    Tobaku Mokushiroku Kaiji 水. #include <bits/stdc++.h> using namespace std; ], b[]; void Run() { while (scanf("%d", a) != EOF) { ; i < ; ++i) scanf("%d", a + i); ; i < ; ++i) scanf("%d", b + i); printf(], b[])…
A    Knight 留坑. B    Tree 思路:两次树形DP,但是要考虑0没有逆元 可以用前缀后缀做 #include <bits/stdc++.h> using namespace std; #define N 1000010 #define ll long long ; int n; ll dp[N], dp2[N]; ll prefix[N], suffix[N]; vector <int> G[N]; void Init() { ; i <= n; ++i)…
A    Birthday 思路:设置一个源点,一个汇点,每次对$源点对a_i, b_i , a_i 对 b_i 连一条流为1,费用为0的边$ 每个点都再连一条 1, 3, 5, 7, ....的边到汇点之间,因为每多加一个流的费用,然后就是最小费用最大流 #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ; ; struct Edge{ int to, nxt, cap, flow, cost;…
A    Relic Discovery 水. #include <bits/stdc++.h> using namespace std; int t, n; int main() { scanf("%d", &t); while (t--) { scanf("%d", &n); ; , a, b; i <= n; ++i) { scanf("%d%d", &a, &b); res += a *…
首先我们可以确认 1的值一定是0 题目要求的是 有边的两个点所代表的值二进制有一位不同(即有边相连的两个值二进制所包含的1的个数相差为1) 所以我们通过他给你的图进行BFS 把原图分为一圈一圈的 并且先给每一个点赋一个初值 这样每一圈内的值二进制所包含的1的个数往外递增且同一圈内值二进制所包含的1的个数是相等的 目前我们就得到了题目的一个可行解 题目追加要求最小字典序 我们发现把这2^n个数二进制表示出来 则有n列 任意两列之间的交换是不会影响值二进制中1的个数且符合边关系的 即交换二进制中的任…