Wannafly 挑战赛27 题解

Wannafly 挑战赛27

题目连接

https://www.nowcoder.com/acm/contest/215#question


A.灰魔法师

题目

在这里插入图片描述

题解

考虑到可能的完全平方数只有400400400多个,因此对于每种数,直接暴力枚举所有的完全平方数计算一下就可以了.

代码

#include <iostream>
#define int long long
const int N = 100007;
int a[N];
int n;
int p2[N];
int tot;
signed main() {for(int i = 1;;i++) {int a = i*i;if(a > 2*N) break;p2[tot++] = a;}std::cin >> n;for(int i = 1;i <= n;++i) {int tmp;std::cin >> tmp;a[tmp] ++;}int ans = 0;for(int i = 1;i <= 100000;++i) {if(a[i] == 0) continue;for(int j = 0;j < tot;++j) {int an = p2[j] - i;if(an < i) continue;if(an == i) ans += a[i]*(a[i]-1)/2;else if(an <= 100000)ans += a[i]*a[an];}}std::cout << ans << std::endl;
}

B.紫魔法师

题目

在这里插入图片描述

题解

注意到至少当存在一个奇环的情况下,一定需要333种颜色,而其他情况下只要222种颜色就足够了.

只需要用tarjan算法求其点双连通分量的大小即可.

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i)
const int N = 100007;
struct edge{int u,v,nxt; 
}es[N<<2];
int head[N],cnt;
int vis[N],dfn[N],low[N],idx;
int v[N<<1],u[N<<1];
std::stack<int> stk;
void addedge(int u,int v) {es[cnt].u = u;es[cnt].v = v;es[cnt].nxt = head[u];head[u] = cnt++;
}
int flag;
void tarjan(int u,int fa) {dfn[u] = low[u] = ++idx;vis[u] = 1;for(int e = head[u];e != -1;e = es[e].nxt) {int v = es[e].v;if(v == fa) continue;stk.push(e);if(!vis[v]) {tarjan(v,u);if(low[u] > low[v]) low[u] = low[v];if(dfn[u] <= low[v]) {//割点int cnt = 0;while(true) {int se = stk.top();stk.pop();cnt++;if(se == e) break;}if(cnt > 1 && cnt % 2 != 0) {flag = 1;}}}else low[u] = std::min(low[u],dfn[v]);}
}
int n,m;
int main() {memset(head,-1,sizeof(head));std::ios::sync_with_stdio(false);std::cin >> n >> m;rep(i,1,m) {int u,v;std::cin >> u >> v;addedge(u,v);addedge(v,u);}tarjan(1,0);if(flag) std::cout << "3" << std::endl;else std::cout << "2" << std::endl;return 0;
}

C.蓝膜法师

题目

在这里插入图片描述

题解

树形dp

状态定义

定义dp[u][i]dp[u][i]dp[u][i]表示uuu子树中包含节点uuu的连通块大小为iii,且其余联通块大小均≤k\le kk的方案数.

注意上述定义中dp[u][0]dp[u][0]dp[u][0]是没有意义的,我们再定义dp[u][0]=∑t=1min{size[u],k}dp[u][t]dp[u][0] = \sum_{t = 1}^{min\{size[u],k\}} dp[u][t]dp[u][0]=t=1min{size[u],k}dp[u][t].

转移方程的计算:

当我们要计算子树uuudpdpdp值的时候,其儿子节点分别为v1,v2,...,vmv_1,v_2,...,v_mv1,v2,...,vm.

如果我们将通向儿子节点vvv的某条边切断,那么这个儿子对uuu节点联通块大小的贡献就没了,但是它的方案数可以取dp[v][1..k]dp[v][1..k]dp[v][1..k],这也就是我们定义dp[v][0]dp[v][0]dp[v][0]的意义所在了,很巧妙地,dp[v][0]dp[v][0]dp[v][0]就刚好等于儿子vvvuuu的联通块贡献为000时的方案数.

那么方程就得到了

dp[u][i]=∑t1+t2+...+tm=i−1dp[v1][t1]∗dp[v2][t2]∗...∗dp[vm][tm]dp[u][i] = \sum_{t_1+t_2+...+t_m=i-1}dp[v_1][t_1]*dp[v_2][t_2]*...*dp[v_m][t_m]dp[u][i]=t1+t2+...+tm=i1dp[v1][t1]dp[v2][t2]...dp[vm][tm]

最后答案就是dp[1][0]dp[1][0]dp[1][0]

实现方式

我们可以先将v1v_1v1uuu合并,再将v2v_2v2uuu合并…

代码

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
const int N = 2018;
typedef long long LL;
const LL P = 998244353;
std::vector<int> edge[N];
LL dp[N][N];
LL tmp[N];
int sz[N];
int n,k;
void dfs(int u,int fa) {sz[u] = 1;dp[u][1] = 1;for(int v : edge[u]) {if(v == fa) continue;dfs(v,u);memset(tmp,0,sizeof(tmp));for(int i = 1;i <= sz[u];++i) {for(int j = 0;j <= sz[v] && i + j <= k;++j) {tmp[i+j] = (tmp[i+j] + (dp[u][i] * dp[v][j] % P)) % P;}}for(int i = 1;i <= k;++i)dp[u][i] = tmp[i];sz[u] += sz[v];}for(int i = 1;i <= k;++i)dp[u][0] = (dp[u][0] + dp[u][i]) % P;
}
int main () {std::ios::sync_with_stdio(false);std::cin >> n >> k;for(int i = 0;i < n-1;++i) {int u,v;std::cin >> u >> v;edge[u].push_back(v);edge[v].push_back(u);}dfs(1,0);std::cout << dp[1][0] << std::endl;return 0;
}

D.绿膜法师

题目

在这里插入图片描述

题解

对于刚加入的数xxx来说,它与集合中其它的数字的gcdgcdgcd必然是它的约数.
那么枚举xxx的约数ddd,其它的数如果与xxxgcd=dgcd = dgcd=d的话,那么其它的数必然也要有约数ddd.因此我们考虑维护一个数组muls[i]muls[i]muls[i],表示集合中的数是iii的倍数的有多少个数.

从大到小枚举xxx的约数ddd,然后muls[d]muls[d]muls[d]就表示与xxxgcd=dgcd=dgcd=d的数的个数.随后枚举ddd的约数d2d_2d2,并muls[d2]−=muls[d]muls[d2]-=muls[d]muls[d2]=muls[d],这样的话就保证了刚刚用过的数不会重复使用(相当于容斥一下,倒序dpdpdp的感觉).依次类推,注意删掉的数在下一个数加入集合之前要加回来,恢复现场.

100000100000100000内的数最多有128128128个约数.
每个数的约数的约数个数和最大不超过2835每个数的约数的约数个数和最大不超过28352835
时间复杂度不会超过100000∗2835=3e8100000*2835=3e81000002835=3e8.总之O(能过)O(能过)O().

代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <queue>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i)
typedef long long LL;
const int N = 100007;
std::vector<int> ds[N];
LL mod_pow(LL x,LL n,LL p) {LL res = 1;while(n) {if(n&1) res = res * x % p;x = x * x % p;n >>= 1;}return res;
}
void sieve() {for(int i = 1;i <= 100000;++i) {for(int j = 1;j*j <= i;++j) {if(i % j != 0) continue;ds[i].push_back(j);if(j*j != i) ds[i].push_back(i/j);}std::sort(ds[i].begin(),ds[i].end(),[](int a,int b){return a > b;});}
}
LL muls[N];
int n;
int main() {sieve();std::ios::sync_with_stdio(false);std::cin >> n;while(n--) {LL x,k,p;std::cin >> x >> k >> p;for(auto t : ds[x])  muls[t] ++;LL ans = 0;std::queue<int> Q;for(auto t : ds[x]) {ans = (ans + muls[t]*mod_pow(t,k,p)) % p;int tmp = muls[t];Q.push(tmp);for(auto ft : ds[t]) {muls[ft] -= tmp;}}for(auto t : ds[x]) {int tmp = Q.front();Q.pop();for(auto ft : ds[t])muls[ft] += tmp;}std::cout << ans << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】OSharpNS,轻量级.net core快速开发框架发布

OSharpNS简介OSharp Framework with .NetStandard2.0&#xff08;OSharpNS&#xff09;是OSharp的以.NetStandard2.0为目标框架&#xff0c;在AspNetCore的现有组件 Microsoft.Extensions.DependencyInjection&#xff0c;Microsoft.Extensions.Configuration&#xff0c;Micro…

ATcoder-Replace Digits【线段树】

正题 题目链接:https://atcoder.jp/contests/abl 题目大意 nnn个数字开始全是111&#xff0c;要求支持 修改一个区间为一个数字&#xff08;是1∼91\sim 91∼9的数&#xff09;求所有数字串起来%998244353\%998244353%998244353 解题思路 其实就是第iii个数字乘上10i10^i10i…

【模拟】字符串展开

字符串展开 题目大意&#xff1a; 一串缩写的字符串&#xff0c;将它缩写前的输出来&#xff08;详情见原题&#xff09; 原题 解题思路&#xff1a; 直接模拟每一个字符即可 代码&#xff1a; #include<cstdio> #include<string> #include<cstring> #…

2018-2019 ACM—ICPC SEERC 题解

2018 - 2019 SEERC 题解 比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了. 在这里分享一篇我自己写的题解,也方便别人补题. 题目链接 http://codeforces.com/gym/101964/attachments/download/7814/seerc-2018.pdf A.Numbers 不留坑,这题不会. B.Broken Watch 题解…

P6623-[省选联考2020A卷]树【Trie,树上启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P6623 题目大意 一棵树&#xff0c;每个节点有一个权值valival_ivali​&#xff0c;定义disi,jdis_{i,j}disi,j​表示iii到jjj的距离。 一个节点xxx的权值定义为该节点子树中的每个节点yyy的disx,yvaljdis_{x,y}val_{j}disx…

【DP】过桥

过桥 题目大意&#xff1a; 有n个人要过一条桥&#xff0c;每个人都有自己的过桥时间&#xff0c;一条桥同时只能有2个人过&#xff08;过桥时间求较慢的一人&#xff09;&#xff0c;且要有人拿着手电筒才能过&#xff0c;只有一个手电筒&#xff0c;且不能扔手电筒&#xf…

.NET Core完成向RyuJIT的迁移

.NET Core CLR团队宣布&#xff0c;他们的.NET Core平台现在已经是完全基于其下一代即时编译器RyuJIT。有人可能不知道&#xff0c;在.NET Core中&#xff0c;编译器&#xff08;Roslyn&#xff09;会把C#代码编译成CIL&#xff08;公共中间语言&#xff09;字节码。接下来&…

P3166-[CQOI2014]数三角形【GCD】

正题 题目链接:https://www.luogu.com.cn/problem/P3166 题目大意 求一个N∗MN*MN∗M的网格上有多少个三角形。 解题思路 考虑减去共线的情况&#xff0c;我们分为两种情况。一是平行于坐标轴的&#xff0c;这个很好算。二是倾斜的&#xff0c;我们考虑如何计算斜下角的。 …

【DP】【BFS】迷之阶梯

迷之阶梯 题目大意&#xff1a; 有n层阶梯&#xff0c;如果上面一层离这一层只有1个单位高度&#xff0c;就可以直接上去&#xff0c;也可以下去一层&#xff0c;当下去k层时&#xff0c;可以向上飞2k{2}^{k}2k个单位高度&#xff0c;当然要找到一个小于等于这个高度的阶梯落…

UVA10601 Cubes - 波利亚定理

Cubes 题意 给出121212根长度相等的木棒,颜色最多有666种,问能构成的本质不同的正方体数量. 题解 根据波利亚定理公式: 设X是元素集合,G是X的置换群,{u1,u2,...,uk}\{u_1,u_2,...,u_k\}{u1​,u2​,...,uk​}是kkk种颜色的集合,CCC是XXX的任意着色集.这时,针对各颜色的数目的…

COMCMS_CORE 起步篇,如何运行和部署

前言&#xff1a;关于最近开源后&#xff0c;不少朋友问&#xff0c;怎么我下载下来&#xff0c;运行不了。或者怎么没有左边菜单。货不对板&#xff1f;还是我吃了数据&#xff1f;感言&#xff1a;开源不容易&#xff0c;更不容易的是&#xff0c;明明毫无保留&#xff0c;还…

P4313-文理分科【最小割】

正题 题目链接:https://www.luogu.com.cn/problem/P4313 题目大意 有n∗mn*mn∗m个人&#xff0c;第(i,j)(i,j)(i,j)选择文科就可以获得arti,jart_{i,j}arti,j​的价值&#xff0c;选择理科就可以获得scii,jsci_{i,j}scii,j​的价值。如果一个选择文科的人周围都选择了文科&a…

初一模拟赛总结(3.30)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf360360360100100100100100100606060100100100222wjjwjjwjj170170170100100100707070000000333fyfyfy167167167100100100505050000171717444hkyhkyhky11011011010010010000000010…

UVALive7670 Asa's Chess Problem,上下界费用流,另类解法

Asa’s Chess Problem 先阐述一下带上下界的边怎么建. 带上下界的建图方法 设我要建一条边(u→v)(u\rightarrow v)(u→v),流量上界为upupup,下界为downdowndown,费用为costcostcost.则我需要建两条边. 为保证一定会有downdowndown的流量流过去,我们可以建立一条u→vu \right…

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言在使用asp.net core 进行api开发完成后&#xff0c;书写api说明文档对于程序员来说想必是件很痛苦的事情吧&#xff0c;但文档又必须写&#xff0c;而且文档的格式如果没有具体要求的话&#xff0c;最终完成的文档则完全取决于开发者的心情。或者详细点&#xff0c;或者简单…

P3201-[HNOI2009]梦幻布丁【启发式合并,链表】

正题 题目链接:https://www.luogu.com.cn/problem/P3201 题目大意 开始有nnn个布丁&#xff0c;第iii个是cic_ici​颜色的。 每次有操作 将所有颜色为xxx的布丁变为颜色yyy的。询问有多少个布丁颜色段。 解题思路 对于每次修改&#xff0c;我们可以考虑启发式合并&#xff…

【贪心】奶酪厂(jzoj 1285)

奶酪厂 题目大意&#xff1a; 有一个奶酪厂&#xff0c;每个星期&#xff08;共n个星期&#xff09;都有一定的单位生产成本和客户需求量&#xff0c;把奶酪保存一个星期每单位要s元&#xff0c;问一共花的钱最少是多少 Sample Input 4 5 88 200 89 400 97 300 91 500Sampl…

P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]

简单的数学题 题目连接 https://www.luogu.org/problemnew/show/P3768 题目描述 输入一个正整数n,n≤1010n,n\le 10^{10}n,n≤1010和p,p≤1.1109p,p \le 1.1 \times 10^9p,p≤1.1109.且ppp为质数. 计算∑i1n∑j1nijgcd(i,j)\sum_{i1}^n\sum_{j1}^nijgcd(i,j)∑i1n​∑j1n​…

.NET Core微服务之基于Exceptionless实现分布式日志记录

一、Exceptionless极简介绍Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#x…

P2801-教主的魔法【分块,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P2801 题目大意 nnn个数字&#xff0c;要求支持 区间加上一个数字www询问一个区间内不小于www的数的个数 解题思路 考虑分块&#xff0c;对于块内我们维护一个排序后的数组&#xff0c;查询时直接在整个块中二分答案即可。修…