EXAM-2018-08-21

自己真的是菜的恐怖

D:Fence Building

欧拉公式:V-E+F=2

在平面中:V为顶点个数,E为边数,F为区域数

在简单几何体中:V为顶点个数,E为边数,F为面数

考虑到区域最多,每个交点最多由两条线构成。 顶点数为C(n,4);边数为C(n,2)+2*C(n,4) 然后减去圆外的.

I: A Possible Tree

  • 题意: 给定一棵带权树的形态, 但是并不知道每天条边的具体权重. 然后给m个信息, 信息格式为u v val, 表示在树上u 到 v 的路径上经过的边的权重的异或和为val, 问前面最多有多少个信息是不冲突的.
  • 题解:从冲不冲突应该想到使用并查集,通过那m次信息构建最小生成树,如果不属于这个集合的就加入集合,属于的就判断是否与之前的最小生成树矛盾。主要是在这个集合内的两点,可以很轻松查询到。(画图理解)val[]记录根节点到该点的距离,然后通过find时路径压缩的操作和add操作更新val[]。这道题写起来很简单,就是难想到。
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int maxn=1e5+7;
  5. int fa[maxn],val[maxn];
  6. int n;
  7. template<class T>
  8. void read(T &res){
  9. res=0;
  10. T f=1;
  11. char c=getchar();
  12. while(c<'0'||c>'9'){
  13. if(c=='-') f=-1;
  14. c=getchar();
  15. }
  16. while(c>='0'&&c<='9'){
  17. res=res*10+c-'0';
  18. c=getchar();
  19. }
  20. res*=f;
  21. }
  22. void init()
  23. {
  24. for(int i=0;i<=n;i++) fa[i]=i;
  25. memset(val,0,sizeof(val));
  26. }
  27. int findd(int u){
  28. if(u!=fa[u]){
  29. int v=fa[u];
  30. fa[u]=findd(v);
  31. val[u]^=val[v];
  32. }
  33. return fa[u];
  34. }
  35. bool add(int u,int v,int w){
  36. int a=findd(u);
  37. int b=findd(v);
  38. if(a!=b){
  39. val[a]=val[v]^val[u]^w;
  40. fa[a]=b;
  41. return true;
  42. }
  43. if((val[u]^val[v])!=w) return false;
  44. else return true;
  45. }
  46. int main(){
  47. int t;
  48. read(t);
  49. int u,v,m,w;
  50. while(t--){
  51. read(n);
  52. read(m);
  53. init();
  54. for(int i=1;i<n;i++){
  55. read(u);
  56. read(v);
  57. }
  58. int flag=0;
  59. for(int i=1;i<=m;i++){
  60. read(u);
  61. read(v);
  62. read(w);
  63. if(!add(u,v,w)&&!flag){
  64. flag=i;
  65. }
  66. }
  67. printf("%d\n",flag-1);
  68. }
  69. return 0;
  70. }

H Count Numbers

cur[n]表示数位和为n的方案数,ans[n]表示前n位的答案。 我们发现,比如说4,方案数等于cur[2]+cur[2],cur[3]+cur[1],cur[4]+cur[0]。通过枚举最后一位就可以得到答案。

  1. cur[i]=SUM cur[i-j];

而和就是前面的位* 10加上与i的差*与i的差的数的方案数。

  1. ans[i]=SUM ans[i-j]*10+j*cur[i-j];

接下来就是矩阵快速幂 枚举18位 构成18*18的矩阵

然后注意写法就好。__int128

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. template<class T>
  5. void read(T &res){
  6. res=0;
  7. T f=1;
  8. char c=getchar();
  9. while(c<'0'||c>'9'){
  10. if(c=='-') f=-1;
  11. c=getchar();
  12. }
  13. while(c>='0'&&c<='9'){
  14. res=res*10+c-'0';
  15. c=getchar();
  16. }
  17. res*=f;
  18. }
  19. struct mac{
  20. ll f[20][20];
  21. mac(){
  22. for(int i=0;i<20;i++){
  23. for(int j=0;j<20;j++){
  24. f[i][j]=0;
  25. }
  26. }
  27. }
  28. void init()
  29. {
  30. for(int i=0;i<20;i++){
  31. f[i][i]=1;
  32. }
  33. }
  34. };
  35. int p;
  36. mac operator*(mac a,mac b)
  37. {
  38. mac c;
  39. for(int i=0;i<18;i++){
  40. for(int j=0;j<18;j++){
  41. if(a.f[i][j])
  42. for(int k=0;k<18;k++){
  43. if(b.f[j][k]){
  44. c.f[i][k]=c.f[i][k]+(a.f[i][j]%p*b.f[j][k]%p)%p;
  45. if(c.f[i][k]>=p) c.f[i][k]-=p;
  46. }
  47. }
  48. }
  49. }
  50. return c;
  51. }
  52. mac qpow(mac a,__int128 k)
  53. {
  54. mac c;
  55. c.init();
  56. while(k>0){
  57. if(k&1) c=c*a;
  58. a=a*a;
  59. k>>=1;
  60. }
  61. return c;
  62. }
  63. ll ans[18],cur[18];
  64. int main()
  65. {
  66. int t;int x,y;
  67. mac a,b;
  68. read(t);
  69. cur[0]=1;
  70. for(int i=1;i<=9;i++){
  71. for(int j=1;j<=i;j++){
  72. cur[i]+=cur[i-j];
  73. ans[i]+=10*ans[i-j]+j*cur[i-j];
  74. }
  75. }
  76. for(int i=0;i<9;i++) a.f[i][0]=10;
  77. for(int i=9;i<18;i++) a.f[i][0]=i-8;
  78. for(int i=1;i<9;i++){
  79. a.f[i-1][i]=1;
  80. }
  81. for(int i=10;i<18;i++){
  82. a.f[i-1][i]=1;
  83. }
  84. for(int i=9;i<18;i++){
  85. a.f[i][9]=1;
  86. }
  87. // for(int i=0;i<18;i++){
  88. // for(int j=0;j<18;j++){
  89. // cout<<setw(3)<<a.f[i][j];
  90. // }
  91. // cout<<endl;
  92. // }
  93. while(t--){
  94. read(x);
  95. read(y);
  96. read(p);
  97. for(int i=0;i<9;i++) b.f[0][i]=ans[9-i]%p;
  98. for(int j=9;j<18;j++) b.f[0][j]=cur[18-j]%p;
  99. // for(int i=0;i<18;i++){
  100. // cout<<b.f[0][i]<<" ";
  101. // }
  102. __int128 k=1;
  103. for(int i=1;i<=y;i++) k*=(__int128)x;
  104. //cout<<k<<endl;
  105. if(k<=9){
  106. printf("%lld\n",ans[k]%p);
  107. }
  108. else{
  109. mac ak=b*qpow(a,k-9);
  110. printf("%lld\n",ak.f[0][0]);
  111. }
  112. }
  113. return 0;
  114. }
  115. /*5
  116. 3 2 100000
  117. */

EXAM-2018-08-21的更多相关文章

  1. 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)

    传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...

  2. 2018.08.21 NOIP模拟 xorand(01trie)

    xorand 描述 有q次操作,每次操作是以下两种: 1. 加入一个数到集合中 2. 查询,查询当前数字与集合中的数字的最大异或值,最大and值,最大or值 输入 第一行1个正整数Q表示操作次数 接下 ...

  3. 2018.08.21 NOIP模拟 unlock(模拟+找规律)

    unlock 描述 经济危机席卷全球,L国也收到冲击,大量人员失业. 然而,作为L国的风云人物,X找到了自己的新工作.从下周开始,X将成为一个酒店的助理锁匠,当然,他得先向部门领导展示他的开锁能力. ...

  4. Microsoft Artificial Intelligence Conference(2018.05.21)

    时间:2018.05.21地点:北京嘉丽大酒店

  5. China Intelligent Office Summit(2018.11.21)

    时间:2018.11.21地点:中关村软件园国际会议中心

  6. Intel Digital Innovation Industry Summit(2018.08.17)

    时间:2018.08.17地点:北京金隅喜来登大酒店

  7. Trusted Cloud Summit(2018.08.14)

    时间:2018.08.14地点:北京国际会议中心

  8. (转)新手C#SQL语句的学习2018.08.13

    1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...

  9. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  10. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

随机推荐

  1. JavaBean和json数据之间的转换(一)简单的JavaBean转换

    1.为什么要使用json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,因为其高性能.可读性强的原因,成为了现阶段web开发中前后端交互数据的主要数据 ...

  2. 《Thinking in Java》位运算

    按位操作符: 首先先记住一件事,方便理解:是否对应正负对应10. 1.与(&):11得1,10得0,00得0. 2.或(|):11得1,10得1,00得0. 3.异或(^):11得0,10得1 ...

  3. Python Email发送,通知业务完成

    Email 发送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text ...

  4. JS-语句三

    关于if语句的几个练习: 1. 输入三个整数,x,y,z,最终以从小到大的方式输出.  思路:先列举出每种可能,然后做if套嵌.        var x = prompt("请输入一个数字 ...

  5. Windbg 大改版,值得期待

    早上从twitter上面看到一篇文章,看到windbg会提供一个Time Travel Debugging(TTD) 功能,该功能会在未来的版本引入. Time travel debugging: I ...

  6. 一本通1402 Vigenère密码

    [题目描述]6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南 ...

  7. ES6 之 字符串扩展

    字符串所有的方法,不会修改字符串本身(字符串是不可变的),操作完成会 返回一个新的字符串. 将一个值转化为字符串,.toString()方法,但是null和undefined值没有这个方法, 1.字符 ...

  8. UML-架构分析-阶段

    初始阶段:架构概念验证原型--->确定其可行性 细化阶段:因素表.技术备忘录.SAD(软件架构文档) 移交阶段:可能会修改SAD->确保与最终部署版本的一致性 后续进化循环:重温架构性因素 ...

  9. 安装lombok插件IDEA的插件栏加载不出来

    打开 Setting-->Appearance & Behavior -->Syetem Setting -->Updates,将Use secure connection  ...

  10. Python—数据结构——链表

    数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...