T1

一开始直接丢了个暴力走人50pts,然后开始打表找规律,啥也没找着,最后二十分钟突然看出来了什么,把 \(f_{n,m}\)式子列了一下,发现常数项没啥规律,最后五分钟,突然闪过一丝灵感,但是是错的。

好吧,其实跟正解就差一个常数项,但是没想到把矩阵放棋盘上,也没想到排列组合。

正解:

把这玩意放个矩阵或者说是棋盘上,考虑从当前点走到 \((n,m)\),对答案所造成的贡献,常数项就是走法的方案数。剩下的就是上边的打表找出来的规律

Code
  1. #include<cstdio>
  2. #define MAX 300010
  3. #define re register
  4. #define int long long
  5. namespace OMA
  6. {
  7. int n,m,a,b,ans;
  8. int f1[MAX],f2[MAX];
  9. int bina[MAX],binb[MAX]; // a,b
  10. const int p = 998244353;
  11. int c[MAX<<1],inv[MAX<<1];
  12. inline int read()
  13. {
  14. int s=0,w=1; char ch=getchar();
  15. while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
  16. while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
  17. return s*w;
  18. }
  19. inline int quickpow(int a,int b)
  20. {
  21. int ans = 1;
  22. while(b)
  23. {
  24. if(b&1)
  25. { ans = ans*a%p; }
  26. a = a*a%p;
  27. b >>= 1;
  28. }
  29. return ans;
  30. }
  31. inline int C(int n,int m)
  32. { return c[n]*inv[m]%p*inv[n-m]%p; }
  33. signed main()
  34. {
  35. bina[0] = binb[0] = inv[0] = c[0] = 1;
  36. n = read(),m = read(),a = read()%p,b = read()%p;
  37. for(re int i=1; i<=n; i++)
  38. { f1[i] = read()%p; binb[i] = b*binb[i-1]%p; }
  39. for(re int i=1; i<=m; i++)
  40. { f2[i] = read()%p; bina[i] = a*bina[i-1]%p; }
  41. int top = n+m;
  42. for(re int i=1; i<=top; i++)
  43. { c[i] = i*c[i-1]%p; }
  44. inv[top] = quickpow(c[top],p-2);
  45. for(re int i=top-1; i>=1; i--)
  46. { inv[i] = (i+1)*inv[i+1]%p; }
  47. for(re int i=n; i>=1; i--)
  48. { (ans += bina[m]*f1[i]%p*binb[n-i]%p*C(n+m-i-1,m-1)%p) %= p; }
  49. for(re int i=m; i>=1; i--)
  50. { (ans += binb[n]*f2[i]%p*bina[m-i]%p*C(n+m-i-1,n-1)%p) %= p; }
  51. printf("%lld\n",ans);
  52. return 0;
  53. }
  54. }
  55. signed main()
  56. { return OMA::main(); }

T2

考场没思路,跳了。

正解是个dp 怪不得没思路

首先,这是个树形dp,但题目中给你的,显然并不是一颗普通的树,它有个环,是个环套树,所以考虑把环去掉,怎么去?,删掉环中的一条边即可,那条边? 随便那条,只要是环上的即可,然后,就可以愉快的dp了,dp可类比一下没有上司的舞会

Code
  1. #include<cstdio>
  2. #include<cstring>
  3. #define MAX 1000010
  4. #define re register
  5. namespace OMA
  6. {
  7. int n,a,b,ans;
  8. struct Graph
  9. {
  10. int next;
  11. int to;
  12. }edge[MAX<<1];
  13. int vis[MAX],rt[2];
  14. int cnt=1,head[MAX];
  15. int w[MAX],dp[MAX][2];
  16. inline int read()
  17. {
  18. int s=0,w=1; char ch=getchar();
  19. while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
  20. while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
  21. return s*w;
  22. }
  23. inline void add(int u,int v)
  24. {
  25. edge[++cnt].next = head[u];
  26. edge[cnt].to = v;
  27. head[u] = cnt;
  28. }
  29. inline void dfs1(int u,int fa)
  30. {
  31. if(vis[u])
  32. { rt[0] = u,rt[1] = fa; return ; }
  33. vis[u] = 1;
  34. for(re int i=head[u]; i; i=edge[i].next)
  35. {
  36. int v = edge[i].to;
  37. if(v!=fa)
  38. { dfs1(v,u); }
  39. }
  40. }
  41. inline int min(int a,int b)
  42. { return a<b?a:b; }
  43. inline void dfs2(int u,int fa)
  44. {
  45. dp[u][0] = 0,dp[u][1] = w[u];
  46. for(re int i=head[u]; i; i=edge[i].next)
  47. {
  48. int v = edge[i].to;
  49. if((u==rt[0]&&v==rt[1])||(u==rt[1]&&v==rt[0]))
  50. { continue ; }
  51. if(v!=fa)
  52. {
  53. dfs2(v,u);
  54. dp[u][0] += dp[v][1];
  55. dp[u][1] += min(dp[v][0],dp[v][1]);
  56. }
  57. }
  58. }
  59. signed main()
  60. {
  61. n = read(),a = read(),b = read();
  62. for(re int i=1; i<=n; i++)
  63. {
  64. int v1 = read(),v2 = read();
  65. w[v1] += a,w[v2] += b;
  66. add(v1,v2),add(v2,v1);
  67. }
  68. dfs1(1,0);
  69. dfs2(rt[0],0),ans = dp[rt[0]][1],dfs2(rt[1],0);
  70. printf("%d\n",min(ans,dp[rt[1]][1]));
  71. return 0;
  72. }
  73. }
  74. signed main()
  75. { return OMA::main(); }

T3

三道里,比较简单的一道了

首先不难发现,\(i\times j\) 为完全平方数时,约数个数为奇数。所以有了60暴力,直接枚举i,j 统计完全平方数的个数,偶数+1,奇数-1。

60pts
  1. #include<cstdio>
  2. #include<cmath>
  3. #define re register
  4. #define int long long
  5. namespace OMA
  6. {
  7. int n,m,ans;
  8. signed main()
  9. {
  10. scanf("%lld%lld",&n,&m);
  11. for(re int i=1; i<=n; i++)
  12. {
  13. int cnt = 0;
  14. for(re int j=1; j<=m; j++)
  15. {
  16. int tmp = i*j;
  17. int gen = sqrt(tmp);
  18. if(gen*gen==tmp)
  19. { cnt++; }
  20. }
  21. if(cnt%2==0)
  22. { ans++; }
  23. else
  24. { ans--; }
  25. }
  26. printf("%lld\n",ans);
  27. return 0;
  28. }
  29. }
  30. signed main()
  31. { return OMA::main(); }

正解:

首先把i拆成 \(p\times q^{2}\) 的形式,那么j则有 \(p\times r^{2}\) 的形式。

那么对答案产生贡献的 \(j\) 有 \(\sqrt{\frac{m}{p}}\) 个,\(p\) 可以通过线性筛求出。

注意,线性筛是一种方法,并不是单指筛素数,但 \(p\) 是可以通过类比线性筛求素数,求出来,线性筛素数,是去找最小质因子,然后将其倍数都标记掉,类似的,可以通过最小质因子来求 \(p\) 。

筛法

Code
  1. #include<cmath>
  2. #include<cstdio>
  3. #define re register
  4. const int top=1e7+10;
  5. int cnt,pri[top];
  6. long long m;
  7. int n,ans,jud[top],p[top];
  8. namespace OMA
  9. {
  10. void opt()
  11. {
  12. p[1] = 1;
  13. for(re int i=2; i<=n; i++)
  14. {
  15. if(!jud[i])
  16. { pri[++cnt] = jud[i] = p[i] = i; }
  17. for(re int j=1; j<=cnt&&i*pri[j]<=n; j++)
  18. {
  19. if(!(p[i]%pri[j]))
  20. { p[i*pri[j]] = p[i]/pri[j]; }
  21. else
  22. { p[i*pri[j]] = p[i]*pri[j]; }
  23. jud[i*pri[j]] = pri[j];
  24. if(!(i%pri[j]))
  25. { break ; }
  26. }
  27. }
  28. }
  29. signed main()
  30. {
  31. scanf("%d%lld",&n,&m);
  32. opt();
  33. for(re int i=1; i<=n; i++)
  34. { int tmp = sqrt(m/p[i]); ans += (tmp%2==0)?1:-1; }
  35. printf("%d\n",ans);
  36. return 0;
  37. }
  38. }
  39. signed main()
  40. { return OMA::main(); }

noip13的更多相关文章

  1. [Luogu 1966] noip13 火柴排队

    [Luogu 1966] noip13 火柴排队 Problem 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...

随机推荐

  1. Spring Cloud组件和架构图

    Spring Cloud是微服务架构的集大成者,将一系列优秀的组件进行了整合. 服务网关:聚合内部服务,提供统一的对外API接口,屏蔽内部实现.可以解决跨域.认证和前端调用负责的问题,便于项目重构.可 ...

  2. Codeforces Round #139 (Div. 2) 题解

    vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...

  3. python使用笔记19--网络操作

    1.get请求 1 import requests 2 import datetime 3 #get请求 4 url = 'http://api.nnzhp.cn/api/user/stu_info' ...

  4. [刘阳Java]_Spring IOC程序代码如何编写_第3讲

    第2讲我们介绍了Spring IOC的基本原理,这篇文章告诉大家Spring IOC程序代码是如何编写的,从而可以更好的理解IOC和DI的概念(所有的Java类的初始化工作扔给Spring框架,一个J ...

  5. 13、java——常用类

    ​  枚举类型   描述一种事物的所有情况|所有可能|所有实例 (1)通过enum关键字定义枚举类型 (2)枚举的成员,字段都作为当前枚举类型的实例存在,默认被public static final修 ...

  6. 【论文阅读】DSDNet Deep Structured self-Driving Network

    前言引用 [2] DSDNet Deep Structured self-Driving Network Wenyuan Zeng, Shenlong Wang, Renjie Liao, Yun C ...

  7. 手写Spring框架,是时候撸个AOP与Bean生命周期融合了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 嘎小子,这片代码水太深你把握不住! 在电视剧<楚汉传奇>中有这么一段刘邦 ...

  8. 【LeetCode】144. 二叉树的前序遍历

    144. 二叉树的前序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 输入:root = [1,null,2,3] 输出:[ ...

  9. P4169-CDQ分治/K-D tree(三维偏序)-天使玩偶

    P4169-CDQ分治/K-D tree(三维偏序)-天使玩偶 这是一篇两种做法都有的题解 题外话 我写吐了-- 本着不看题解的原则,没写(不会)K-D tree,就写了个cdq分治的做法.下面是我的 ...

  10. POJ1704 Georgia and Bob 题解

    阶梯博弈的变形.不知道的话还是一道挺神的题. 将所有的棋子两两绑在一起,对于奇数个棋子的情况,将其与起点看作一组.于是便可以将一组棋子的中间格子数看作一推石子.对靠右棋子的操作是取石子,而对左棋子的操 ...