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[]。这道题写起来很简单,就是难想到。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
int fa[maxn],val[maxn];
int n;
template<class T>
void read(T &res){
res=0;
T f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
res=res*10+c-'0';
c=getchar();
}
res*=f;
}
void init()
{
for(int i=0;i<=n;i++) fa[i]=i;
memset(val,0,sizeof(val));
}
int findd(int u){
if(u!=fa[u]){
int v=fa[u];
fa[u]=findd(v);
val[u]^=val[v];
}
return fa[u];
}
bool add(int u,int v,int w){
int a=findd(u);
int b=findd(v);
if(a!=b){
val[a]=val[v]^val[u]^w;
fa[a]=b;
return true;
}
if((val[u]^val[v])!=w) return false;
else return true;
}
int main(){
int t;
read(t);
int u,v,m,w;
while(t--){
read(n);
read(m);
init();
for(int i=1;i<n;i++){
read(u);
read(v);
}
int flag=0;
for(int i=1;i<=m;i++){
read(u);
read(v);
read(w);
if(!add(u,v,w)&&!flag){
flag=i;
}
}
printf("%d\n",flag-1);
}
return 0;
}

H Count Numbers

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

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

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

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

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

然后注意写法就好。__int128

#include <bits/stdc++.h>
#define ll long long
using namespace std;
template<class T>
void read(T &res){
res=0;
T f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
res=res*10+c-'0';
c=getchar();
}
res*=f;
}
struct mac{
ll f[20][20];
mac(){
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
f[i][j]=0;
}
}
}
void init()
{
for(int i=0;i<20;i++){ f[i][i]=1;
}
}
};
int p;
mac operator*(mac a,mac b)
{
mac c;
for(int i=0;i<18;i++){
for(int j=0;j<18;j++){
if(a.f[i][j])
for(int k=0;k<18;k++){
if(b.f[j][k]){
c.f[i][k]=c.f[i][k]+(a.f[i][j]%p*b.f[j][k]%p)%p;
if(c.f[i][k]>=p) c.f[i][k]-=p;
}
}
}
}
return c;
}
mac qpow(mac a,__int128 k)
{
mac c;
c.init();
while(k>0){
if(k&1) c=c*a;
a=a*a;
k>>=1;
}
return c;
}
ll ans[18],cur[18];
int main()
{
int t;int x,y;
mac a,b;
read(t);
cur[0]=1;
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
cur[i]+=cur[i-j];
ans[i]+=10*ans[i-j]+j*cur[i-j];
}
}
for(int i=0;i<9;i++) a.f[i][0]=10;
for(int i=9;i<18;i++) a.f[i][0]=i-8;
for(int i=1;i<9;i++){
a.f[i-1][i]=1;
}
for(int i=10;i<18;i++){
a.f[i-1][i]=1;
}
for(int i=9;i<18;i++){
a.f[i][9]=1;
}
// for(int i=0;i<18;i++){
// for(int j=0;j<18;j++){
// cout<<setw(3)<<a.f[i][j];
// }
// cout<<endl;
// }
while(t--){
read(x);
read(y);
read(p);
for(int i=0;i<9;i++) b.f[0][i]=ans[9-i]%p;
for(int j=9;j<18;j++) b.f[0][j]=cur[18-j]%p;
// for(int i=0;i<18;i++){
// cout<<b.f[0][i]<<" ";
// }
__int128 k=1;
for(int i=1;i<=y;i++) k*=(__int128)x;
//cout<<k<<endl;
if(k<=9){
printf("%lld\n",ans[k]%p);
}
else{
mac ak=b*qpow(a,k-9);
printf("%lld\n",ak.f[0][0]);
}
}
return 0;
}
/*5
3 2 100000
*/

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. C/C++学习笔记_gdb调试

    1.前提条件:可执行文件包含调试信息 gcc -g 2.gdb 文件名 ---启动gdb调试 3.查看代码的命令 当前文件: list 行号(函数名) 指定文件: list 文件名:行号(函数名)4. ...

  2. element穿梭框el-transfer增加拖拽排序和shift多选checkbox功能

    <template> <div class="demo"> <el-transfer v-model="value" filter ...

  3. 每天一点点之vue框架开发 - axios拦截器的使用

    <script> import axios from 'axios' export default { name: 'hello', data () { return { msg: 'We ...

  4. vsCode--设置显示文件和搜索过滤

    文件位置:文件(File)-首选项(Preference)-设置(setting) 打开setting.json文件输入一下内容即可 { "search.exclude": { & ...

  5. C#调用C++系列二:传结构体

    这一篇记录下C#调用C++的结构体的方式来使用OpenCV的数据格式,这里会有两种方式,第一种是C#传一个结构体和图像的路径给C++,然后C++将图像加载进来,再把传进来的结构体填满即可,第二种是C# ...

  6. 十二、GUI设计-画图程序

    """小小画笔""" from tkinter import *from tkinter.filedialog import *from t ...

  7. 干货 | 京东云Kubernetes集群+Traefik实战

    摘要 Traefik支持丰富的annotations配置,可配置众多出色的特性,例如:自动熔断.负载均衡策略.黑名单.白名单.所以Traefik对于微服务来说简直就是一神器. 利用Traefik,并结 ...

  8. 磁盘报No space left on device,但是 df -h 查看磁盘空间没满

    df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/dev01-root 75G 58G 14G 82% / udev 2.0G ...

  9. runlevel 运行级别

    linux启动过程 关于Ubuntu 12.04修改默认运行级别,启动字符界面的个人理解   网上通常的做法是:(亲自试验,不管用),如果想直接操作请看绿色字体部分 (1)第一种方法:   由于Red ...

  10. rpm -qa -qc 查询安装过的软件

    dpkg  -l  | grep ssh        #Ubuntu rpm -qa |grep ssh   #centos 通过ps -e |grep ssh命令查看是否启动.如果只有ssh-ag ...