• Wannafly挑战赛 22


    爆零祭

    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

    和角公式
    初三党表示凉凉

  • 相关阅读:
    RS交叉表按照预定的节点成员排序
    Open DJ备份与恢复方案
    SQLServer2008备份时发生无法打开备份设备
    数据仓库备份思路
    SQLServer代理新建或者编辑作业报错
    Transfrom在64bit服务下面无法运行
    ActiveReport开发入门-图表的交互性
    ActiveReport开发入门-列表的交互性
    /etc/fstab 参数详解(转)
    CentOS7 查看硬盘情况
  • 原文地址:https://www.cnblogs.com/hjmmm/p/9496753.html
Copyright © 2020-2023  润新知