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):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...
随机推荐
- HDU_1059 多重背包问题
F - Dividing Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- MySQL-复制技术演进过程
复制技术的演进可以分为:基于数据安全的复制,基于效率的复制 基于数据安全的复制 异步复制 参考: https://baijiahao.baidu.com/s?id=163939455634386120 ...
- Python Email发送,通知业务完成
Email 发送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text ...
- ArchLinux安装(BIOS)
ArchLinux安装(BIOS) 说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点) 官方安装指导 一.连接网络 1.连接 # wifi-menu 2.检查是否联通 ( ...
- STL学习顺序
仅供参考,大家要学会自己制作,很有成就感的啊! 先看<c++标准程序库>这本书很厚,但是其实很简单,然后再看effective stl,注意顺序,我初学的时候stl还没了解多少就看effe ...
- python爬取招聘网站数据
# -*- coding: utf-8 -*- # 爬虫分析 from bs4 import BeautifulSoup from lxml import etree from selenium im ...
- SpringCloud学习之Ribbon使用(四)
1.关于 Ribbon Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具.Ribbon 是 Netflix 发布的开源项目,主要功能是提供客 ...
- RewriteEngine On
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond ...
- Linux 文件上传
Linux 文件上传操作 SecureCRT与linux互相上传和下载文件 1. 需要上传或者下载,需要使用rz和sz命令. 2. 如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装 ...
- UVA_10603 倒水问题 隐式图搜索
这道题目是刘汝佳白书上的例题,没有LRJ在白书上提到的划归为搜索问题,还真是一时难以想到好的解法.即三个瓶子,任意的一个状态都是一个节点,最后就划归为一个搜索问题. 由于题目数据量不大,三个杯子容量都 ...