EXAM-2018-08-21
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的更多相关文章
- 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)
传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...
- 2018.08.21 NOIP模拟 xorand(01trie)
xorand 描述 有q次操作,每次操作是以下两种: 1. 加入一个数到集合中 2. 查询,查询当前数字与集合中的数字的最大异或值,最大and值,最大or值 输入 第一行1个正整数Q表示操作次数 接下 ...
- 2018.08.21 NOIP模拟 unlock(模拟+找规律)
unlock 描述 经济危机席卷全球,L国也收到冲击,大量人员失业. 然而,作为L国的风云人物,X找到了自己的新工作.从下周开始,X将成为一个酒店的助理锁匠,当然,他得先向部门领导展示他的开锁能力. ...
- Microsoft Artificial Intelligence Conference(2018.05.21)
时间:2018.05.21地点:北京嘉丽大酒店
- China Intelligent Office Summit(2018.11.21)
时间:2018.11.21地点:中关村软件园国际会议中心
- Intel Digital Innovation Industry Summit(2018.08.17)
时间:2018.08.17地点:北京金隅喜来登大酒店
- Trusted Cloud Summit(2018.08.14)
时间:2018.08.14地点:北京国际会议中心
- (转)新手C#SQL语句的学习2018.08.13
1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...
- 新手C#SQLServer在程序里实现语句的学习2018.08.12
从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...
- 新手C#SQL Server使用记录2018.08.10
主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...
随机推荐
- web.xml中filter加载顺序出现的问题
刚刚遇到了一个问题,项目中需要用到characterEncodingFilter和HiddenHttpMethodFilter,但是post请求还是会中文乱码,找了半天原因,后来发现,filter加载 ...
- leetcode - 两数之和Ⅳ 输入BST(653)
题目描述:给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 解题思路:根据二叉搜索树的特点,对二叉搜索树进行中序遍历可以得到一个从小到达排 ...
- OpenResty从入门到开发一个网关服务(使用etcd作为注册中心)
简介 OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过揉和众多设计良 ...
- 洛谷 P2196 挖地雷
题目传送门 解题思路: 记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!! AC代码: #include<iostream> #include<cstdi ...
- 图解kubernetes容器状态同步机制核心实现
在K8s中将Pod调度到某一台Node节点之后,后续的状态维护信息则是由对应机器上的kubelet进行维护,如何实时反馈本地运行状态,并通知apiserver则是设计的难点, 本节主要是通过感知Pod ...
- 干货 | AI人脸识别之人脸搜索
本文档将利用京东云AI SDK来实践人脸识别中的人脸搜索功能,主要涉及到分组创建/删除.分组列表获取.人脸创建/删除.人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最 ...
- UML-什么是用例实现(场景实现)?
1.总览图 解释: 用例--->领域模型 用例+领域模型--->设计模型(仅基于领域层的交互图) 2.什么是用例实现? 基于协作对象,如何在设计模型中实现某个用例.更确切的说是实现某个用例 ...
- template.js的介绍
artTemplate 介绍 artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还 ...
- 和我一起从0学算法(C语言版)(三)
第二章 暴力求解(枚举法) 第一节 小学奥数题-程序求解 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 ...
- 91.一次性处理多条数据的方法:bulk_create,update,delete
(1)bulk_create: 可以一次性的创建多个对象 示例代码如下: from django.http import HttpResponse from .models import Pulish ...