爆零祭

T1

这题第一反应gcd啊

所以就把每个a[i]对m取模

然后求它们的gcd

即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m)

ans = 1 + (m - 1) / res;

给res判个零 是零直接输出一

后来发现这么干的话 对于数据

3 10

9 9 9

gcd是9哇 但是所有的模数都能取到

就无厘头改成了res = min(res, m - res) 乍一看貌似很有道理

但是不会证 也wa凉凉啊

比赛后看到题解说是gcd(m, a[1], a[2], .., a[n])

并不会证。。慌张ing

想一想一开始把a[i] % m

是因为(a[i] + a[j]) % m = (a[i] % m + a[j] % m) % m;

就觉得 比如 所有a[i] % m都是偶数 最后和就不会是奇数

但是naive了。。。模数要是是奇数 结果不是照样能取奇数么

现在就可以看作有a[1], a[2], ... , a[n], m这n + 1个数

可以把a[1] ~ a[n]任意加 或者减去数个m

求能得到多少个小于m的值

所以取gcd(m, a[1], a[2], ..., a[n])

某神犇表示可以用扩展欧几里得来帮助理解【就是下面那个链接的博主


T2

看到DAG,看到计数,想到拓扑排序

如果一个点前面有k条通向自己的边为’

那么它后面大写字母就有k + 1种取法

如果它后面有k条出路为'
'

那么它前面为'.'的边的结果要乘k + 1

一开始要把边变成点

正逆向拓扑 统计'_'

然后大写字母和'.'询问前后点

但当时就是脑抽 只算了k == 1的情况

另附某大神的题解

考虑先处理出以每一个点出发/结尾的只经过空格的路径条数,

然后借着之前的那个处理出以每一个点结尾/出发的只经过一个头/尾字符(其他都是空格)的路径条数。

然后就可以方便的统计答案了。

by-zhouzhendong-

文章来源

另 不同的统计十分混乱 建议使用封装重新建图

AC代码【由于这是第一次用封装 参考了那位大佬:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <queue>
#include <cstring>
using namespace std;
const int N = 5e4 + 5;
const long long P = 1ll << 32;
struct G{
static const int M = N;
int cnt, v[M], t[M], next[M], head[M];
void clear(){
cnt = 0; memset(head, -1, sizeof(head));
}
void add(int x, int y, int z){
v[++cnt] = y, t[cnt] = z, next[cnt] = head[x], head[x] = cnt;
}
}g, g2, s1, s2;
int n, m;
int rd[N], cd[N], a1[N], a2[N], l[N], r[N];
int vis1[N], vis2[N];
int a[N], b[N], c[N]; void solve1(int x){
if(vis1[x]) return ; vis1[x] = 1;
a1[x] = cd[x];
for(int i = g.head[x]; i != -1; i = g.next[i]){
int y = g.v[i]; solve1(y);
a1[x] += a1[y];
}
} void solve2(int x){
if(vis2[x]) return ; vis2[x] = 1;
a2[x] = cd[x];
for(int i = g.head[x]; i != -1; i = g.next[i]){
int y = g2.v[i]; solve2(y);
a2[x] += a2[y];
}
} void dfs1(int x){
if(r[x]) return ; r[x] = 1;
for(int i = s1.head[x]; i != -1; i = s1.next[i]){
int y = s1.v[i]; dfs1(y);
r[x] += r[y];
}
} void dfs2(int x){
if(l[x]) return ; l[x] = 1;
for(int i = s2.head[x]; i != -1; i = s2.next[i]){
int y = s2.v[i]; dfs2(y);
l[x] += l[y];
}
} void dfs3(int x){
if(vis1[x]) return ; vis1[x] = 1;
for(int i = s1.head[x]; i != -1; i = s1.next[i]){
int y = s1.v[i]; dfs3(y);
cd[x] += cd[y];
}
} void dfs4(int x){
if(vis2[x]) return ; vis2[x] = 1;
for(int i = s2.head[x]; i != -1; i = s2.next[i]){
int y = s2.v[i]; dfs4(y);
rd[x] += rd[y];
}
} inline void init(){
g.clear();
g2.clear();
s1.clear();
s2.clear();
int x, y, type; char s[10];
for(int i = 1; i <= m; i++){
scanf("%d%d%s", &x, &y, s);
if(s[0] <= 'z' && s[0] >= 'a') type = 0;
else if(s[0] <= 'Z' && s[0] >= 'A') type = 1;
else if(s[0] == '.') type = -1;
else if(s[0] == '_') type = -2;
if(type != 1 && type != -1) g.add(x, y, type);
if(type == -2){
g2.add(x, y, type);
s1.add(x, y, type);
s2.add(y, x, type);
}
a[i] = x, b[i] = y, c[i] = type;
}
} int main(){
scanf("%d%d", &n, &m);
init();
for(int i = 1; i <= n; i++) {
dfs1(i); dfs2(i);
}
for(int i = 1; i <= m; i++){
if(c[i] == -1) cd[a[i]] += r[b[i]];
else if(c[i] == 1) rd[b[i]] += l[a[i]];
}
memset(vis1, 0, sizeof vis1);
memset(vis2, 0, sizeof vis2);
for(int i = 1; i <= n; i++){
solve1(i); solve2(i);
}
long long ans = 0;
for(int i = 1; i <= n; i++)
ans += 1ll * rd[i] * a1[i];
printf("%lld", (ans % P + P) % P);
return 0;
}

T3

瑟瑟发抖.jpg & 毫无思路.jpg

上面那个链接的大神说结论是



证明链接

T4

和角公式

初三党表示凉凉

Wannafly挑战赛 22的更多相关文章

  1. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  2. Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询

    题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...

  3. 多项式 Wannafly挑战赛22

    后缀表达式 大整数(加法.乘法.gcd java) import java.math.BigInteger; import java.util.Scanner; class Work { String ...

  4. Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)

    原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: ...

  5. Wannafly挑战赛22

    B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...

  6. Wannafly挑战赛22 C 多项式(大数,多项式极限)

    链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  7. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)

    链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  8. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )

    链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...

  9. Wannafly挑战赛13 zzf的好矩阵 题解 答案解释

    Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...

随机推荐

  1. NoSQL是什么?

    导读 NoSQL(not only sql,不仅仅是SQL),是一项全新的数据库革命性运动,泛指非关系型数据库,对于NoSQL这个新兴的名词,每个人的理解都不同.其实NoSQL一词最早出现于1998年 ...

  2. 将工程改造为SOA架构

    商城是基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询需要两个系统之间进行通信. 流动计算架构 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基 ...

  3. Solrcloud(Solr集群)

    Solrcloud(Solr集群) Solrcloud介绍: SolrCloud(solr集群)是Solr提供的分布式搜索方案. 当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud. ...

  4. CentOS 6.5 手动rpm包安装gcc、g++

    摘自:https://blog.csdn.net/lichen_net/article/details/70211204 mount CentOS的安装光盘,然后先后安装 rpm -ivh ppl-0 ...

  5. 福州大学软件工程1816 | W班 第3次作业成绩排名

    写在前面 汇总成绩排名链接 1.作业链接 第三次作业--原型设计(结对第一次) 2.评分准则 本次作业总分 25分,由以下部分组成: (1)在随笔开头请加上该博客链接,以方便阅读时查看作业需求,并备注 ...

  6. 多线程系列之十一:Two-Phase Termination模式

    一,Two-Phase Termination模式 翻译过来就是:分两阶段终止 二,示例程序 public class CountupTread extends Thread { private lo ...

  7. mysql之找回误删数据

    场景:我们开发阶段,经常要有一些测试数据在我们测试相关功能的时候,是十分必要的.后期由于引入了正式的数据,但是测试数据并没有被及时清理.这个时候由于一个误删除,导致一些正式的数据被删除,由此,一场追找 ...

  8. HTTL之初印象

    概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...

  9. Velocity中判断是否为空

    方法一: 使用 #ifnull() 或 #ifnotnull() eg:#ifnull ($foo) 要使用这个特性必须在velocity.properties文件中加入: userdirective ...

  10. 剑指Offer(9)

    题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解法: 要考虑到底数为0,指数为负数的情况,这道题主要考的是对边界值的思考. p ...