题目链接

放羊的贝贝

只需要找出最小、最大的横坐标、纵坐标,就可以计算出答案了。

int n, m, k, lx, rx, ly, ry;
int main(){n = rd(), m = rd(), k = rd();lx = rd(), ly = rd(), rx = rd(), ry = rd();while(k--){rg int x = rd(), y = rd();if(x < lx)lx = x;if(x+1 > rx)rx = x+1;if(y < ly)ly = y;if(y+1 > ry)ry = y+1;}printf("%lld\n", 2ll*(ry-ly+rx-lx));return 0;
}

114514

移项,得到 \((i^{11}-i)(i^{441}-i)i^{10}\equiv 0 \pmod {451\times 4}\)。
根据费马小定理,\(a^{p-1}\equiv 1 \pmod p\),那么 \(a^p-a\equiv 0\pmod p\) 。
由于 \(451\times 4=11\times 41\times 4\) ,所以 \(i^{11}-i\equiv 0\pmod {11}\)。\(i^{441}\equiv i^{41}\times (i^{40})^{10}\equiv i \pmod {41}\),所以 \(i^{441}-i\equiv 0\pmod {41}\)。
又由于 \(i^{11}\) 与 \(i\) 奇偶性相同,\(i^{441}\) 与 \(i\) 奇偶性相同,所以 \((i^{11}-i)(i^{441}-i)\) 也是 \(4\) 的倍数。
所以对于任意的 \(i\),都有 \((i^{11}-i)(i^{441}-i)i^{10}\equiv 0 \pmod {451\times 4}\)。

int main(){cout << rd();return 0;
}

1919810

考虑 \(\text{dp}\),设 \(dp_{i,j}\) 为令第数组 \(i\) 位作为子序列的第 \(j\) 位的方案数,那么讨论第 \(j\) 位需要比前一位大还是小,从先前的状态转移过来即可。

cint maxn = 1000010, mod = 1e9+7;
int s[maxn], n, f[8][10], ans;
int main(){while(scanf("%1d", &s[++n]) == 1); --n;f[1][s[1]] = 1;fp(i, 2, n){++f[1][s[i]];fp(j, 2, 7){rg int dp = 0;if(j == 2 || j == 4)fp(k, 0, s[i]-1)dp = (dp+f[j-1][k])%mod;else fp(k, s[i]+1, 9)dp = (dp+f[j-1][k])%mod;f[j][s[i]] = (f[j][s[i]]+dp)%mod;}}fp(i, 0, 9)ans = (ans+f[7][i])%mod;printf("%d\n", ans);return 0;
}

逃亡的贝贝

二分答案,设当前答案为 \(ans\),将所有 \(w\leq ans\) 的边连上,边权为 \(0\);再将所有 \(\lfloor \frac{114w}{514}\rfloor\leq ans\) 的边脸上,边权为 \(1\) 。再跑一个最短路,如果 \(s\) 到 \(t\) 的最短路小于等于 \(k\) ,就说明这个答案可行。
最短路直接用 \(\text{01bfs}\) 跑,复杂度为 \(\text O((n+m)\log w)\) 。

cint maxn = 100010, maxm = 200010;
int n, m, s, t, k, dis[maxn];
struct node{ int u, v, w; }nd[maxm];
struct edge{ int to, dis, nxt; }e[maxm<<1];
int head[maxn], cnt;
il void add(cint &u, cint &v, int w){ e[++cnt] = (edge){v, w, head[u]}, head[u] = cnt; }
deque<int> q;
int main(){n = rd(), m = rd(), s = rd(), t = rd(), k = rd();if(s == t)return puts("0"), 0;fp(i, 1, m)nd[i].u = rd(), nd[i].v = rd(), nd[i].w = rd();int L = 1, R = 1e9, md, ans = -1;while(L <= R){md = L+R>>1, memset(head, 0, sizeof head), cnt = 0;fp(i, 1, m){if(nd[i].w <= md)add(nd[i].u, nd[i].v, 0), add(nd[i].v, nd[i].u, 0);else if((114ll*nd[i].w+513)/514 <= md)add(nd[i].u, nd[i].v, 1), add(nd[i].v, nd[i].u, 1);}while(q.size())q.pop_front();memset(dis, 0x3f, sizeof dis), q.push_front(s), dis[s] = 0;while(q.size()){rg int u = q.front(); q.pop_front();if(u == t)break;go(u)if(dis[e[i].to] > dis[u]+e[i].dis){dis[e[i].to] = dis[u]+e[i].dis;if(!e[i].dis)q.push_front(e[i].to);else q.push_back(e[i].to);}}if(dis[t] <= k)ans = md, R = md-1;else L = md+1;}if(~ans)printf("%d\n", ans);else puts("I really need TS1's time machine again!");return 0;
}

炫酷反演魔术

\[\sum_{i=1}^n\sum_{j=1}^n\varphi((a_i,a_j^3)) = \sum_{d=1}^n\varphi(d)\sum_{d|a_i}\sum_{d|a_j^3}[(a_i,a_j^3)=d] \\=\sum_{d=1}^n\varphi(d)\sum_{d|a_i}\sum_{d|a_j^3}\sum_{t|\frac{a_i}{d},t|\frac{a_j^3}{t}}\mu(t) \\=\sum_{d=1}^n\varphi(d)\sum_{t=1}^n\mu(t)\sum_{i=1}^n[td|a_i]\sum_{j=1}^n[td|a_j^3] \\=\sum_{T=1}^n(\sum_{d|T}\mu(d)\varphi(\frac{T}{d}))(\sum_{i=1}^n[T|a_i])(\sum_{j=1}^n[T|a_j^3]) \]

设 \(f_T=\sum_{d|T}\mu(d)\varphi(\frac{T}{d})\),\(f=\mu*\varphi\),所以 \(f\) 也是积性函数,可以用线筛 \(\text O(n)\) 算出来。
记 \(g_T=\sum_{i=1}^n[T|a_i]\),这个可以直接 \(\text O(n\ln n)\) 算出来。
记 \(h_T=\sum_{i=1}^n[T|a_i^3]\),设 \(T=\prod_{i=1}^kp_i^{e_i}\),分别讨论每个质因数。
若 \(p^e|a^3\),则 \(p^{\lceil\frac{e}{3}\rceil}|a\)。所以记 \(T'=\prod_{i=1}^kp_i^{\lceil\frac{e_i}{3}\rceil}\),则 \(h_T=g_{T'}\) 。
所以总复杂度就是 \(\text O(n\log n)\)

cint maxn = 300010;
int n, a[maxn];
int pri[maxn], cnt, mu[maxn], phi[maxn], f[maxn], v[maxn], vk[maxn];
int c[maxn], g[maxn], h[maxn];
LL ans;
int main(){n = rd(), phi[1] = f[1] = 1;fp(i, 1, n)a[i] = rd(), ++c[a[i]];fp(i, 2, n){if(!v[i])v[i] = i, mu[i] = -1, phi[i] = i-1, f[i] = i-2, vk[i] = i, pri[++cnt] = i;for(rg int j = 1; j <= cnt && pri[j]*i <= n; ++j){v[i*pri[j]] = pri[j];if(i%pri[j] == 0){phi[i*pri[j]] = phi[i]*pri[j], vk[i*pri[j]] = vk[i]*pri[j];if(vk[i] == i)f[i*pri[j]] = phi[i*pri[j]]-phi[i];else f[i*pri[j]] = f[i/vk[i]]*f[vk[i*pri[j]]];break;}phi[i*pri[j]] = pri[i]*phi[pri[j]], mu[i*pri[j]] = -mu[i];vk[i*pri[j]] = pri[j], f[i*pri[j]] = f[i]*f[pri[j]];}}fp(i, 1, n)for(rg int j = i; j <= n; j += i)g[i] += c[j];fp(i, 1, n){rg int x = i, res = 1;while(x > 1){rg int k = 0, p = v[x];while(x%p == 0)x /= p, ++k;fp(i, 1, (k+2)/3)res *= p;}h[i] = g[res];}fp(i, 1, n)ans += 1ll*f[i]*h[i]*g[i];printf("%lld\n", ans);return 0;
}

树剖分剖树

学到了……随机化算法,随机生成一个序列 \(v\),将 \(w_i\) 映射为 \(v_{w_i}\) ,然后将某一段长度为 \(k\) 的序列异或起来,若结果等于 \(v_1\bigotimes v_2...\bigotimes v_k\) ,那就认为它是长度为 \(k\) 的排列。出错率不会算,反正能过
对于每棵子树,记录一下深度为 \(\text{dep}\),到根节点的异或和为 \(\text{val}\) 的点的个数,合并的时候启发式合并,同时计算答案即可。用 \(\text{map}\) 来记录的话复杂度就是 \(\text O(n\log^2n)\)。

cint maxn = 300010;
int n, k, w[maxn], val[maxn], res;
int sum[maxn], dep[maxn];
LL ans;
map< pair<int, int>, int > mp[maxn];
struct edge{ int to, nxt; }e[maxn<<1];
int head[maxn], cnt;
il void add(cint &u, cint &v){ e[++cnt] = (edge){ v, head[u] }, head[u] = cnt; }
void dfs(int u, int pre){dep[u] = dep[pre]+1, sum[u] = sum[pre]^w[u];++mp[u][make_pair(dep[u], sum[u])];go(u)if(e[i].to != pre){rg int v = e[i].to;dfs(v, u);if(mp[u].size() < mp[v].size())swap(mp[u], mp[v]);for(auto &x : mp[v]){pair<int, int> tmp = x.first;pair<int, int> des = make_pair(k-tmp.first-1+2*dep[u], res^tmp.second^w[u]);if(mp[u].count(des))ans += 1ll*mp[u][des]*x.second;}for(auto &x : mp[v]){if(x.first.first-dep[u] >= k)continue;mp[u][x.first] += x.second;}}
}
int main(){srand(20040127);n = rd(), k = rd();fp(i, 1, n)val[i] = rand()*rand();fp(i, 1, n)w[i] = val[rd()];fp(i, 2, n){rg int u = rd(), v = rd();add(u, v), add(v, u);}fp(i, 1, k)res ^= val[i];dfs(1, 0), printf("%lld\n", ans);return 0;
}

牛客练习赛104练习笔记相关推荐

  1. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  3. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  4. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  5. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  6. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  7. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

  8. 妄想集合(牛客练习赛90)

    妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...

  9. 踩不出足迹(牛客练习赛88 )

    踩不出足迹(牛客练习赛88 ) 题意: 长度为n的数组a,每个数是一个k位二进制 定义一下操作: 令第一次得到的结果为 a1a_1a1​.你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同 ...

最新文章

  1. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV
  2. [解决方案记录]No module named fused(stylegan2的bug,已更新)
  3. 7.1 函数的一般形式
  4. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
  5. CentOS 6.9安装配置nmon
  6. spring架构整理
  7. [go]---从java到go(02)---一个简单的handler模式的实现
  8. java textfield方法,Java TextField求教育
  9. Asp.net网站使用HttpHandler实现图片防盗链功能
  10. 工业镜头的主要参数与选型
  11. python搭建网盘网站_搭建nextcloud私有云存储网盘
  12. vue 实现ps图片编辑_详解vue项目中实现图片裁剪功能
  13. 在IE地址栏显示自己的小图标
  14. 【Camera专题】Sprd-深入浅出Camera驱动框架1(HAL层-Kernel层)
  15. 2022医院三基考试加血提分每日一练及答案
  16. 最近的错误整理(LMY)
  17. AutoCAD Civil 3D坐标几何(COGO)输入
  18. 用Matlab进行快速傅里叶变换
  19. IDEA自动重写的equals方法分析
  20. 架构--系统的可扩展性

热门文章

  1. python保存csv_python将字典保存为csv
  2. 利用信号量实现进程互斥(操作系统)
  3. 排序excel怎么设置_Excel排序技巧:这些不同方式的排序方法你都会了么?
  4. Hadoop单机版安装(保姆级教学)
  5. 老李分享:锁定客户的六大策略:教你如何将切换成本嵌入商业模式 2
  6. Linux上端口没被占用却报错,【linux】80端口被占用了吗
  7. 如何编写高质量的C#代码(一)
  8. 微信个人号经营和裂变增粉的实操心法大全
  9. 实用计算机计算方法,科学的方法:最简单实用的计算机功率计算方法
  10. Unity灯光效果及设置