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. [Python函数]encode,decode

    前言: 我们知道,计算机是以二进制为单位的,也就是说计算机只识别0和1,也就是我们平时在电脑上看到的文字,只有先变成0和1,计算机才会识别它的意思.这种数据和二进制的转换规则就是编码.计算机的发展中, ...

  2. Golang---BASE64编码原理

    BASE64编码概念 Base64 是一种基于64个可打印字符来表示二进制数据的表示方法.在 Base64中可打印字符包括字母 A-Z, a-z, 数字 0-9,这样共有 62 个字符,另外两个可打印 ...

  3. 实盘交易哪些代码BUG产生严重亏损

    1.少写一个return,疯狂开平2900次,以爆仓结束 2.在上生产环境前,不小心误删除了一个“!”(我至今也不清楚为什么会误删了,晕),导致平仓逻辑一直不满足,不止损,让我损失惨重! 3.卖单变买 ...

  4. Cordova搭建环境与问题小结

    1.Cordova介绍: Apache Cordova是一套设备API,允许移动应用的开发者使用JavaScript来访问本地设备的功能,比如摄像头.加速计.它可以与UI框架(如jQuery Mobi ...

  5. JZOJ-2019-11-5 B组

    T1 给出一二维01矩阵\(f_{i,j}\), 定义点\((x_a, y_a), (x_b, y_b)\)的「距离」为\(max\{|x_a-x_b|, |y_a-y_b|\}\) 求出一矩阵\(w ...

  6. C++ STD Gems02

    remove.remove_if.replace.replace_if.remove_copy_if.unique #include <iostream> #include <str ...

  7. codeforces 596 C. p-binary

    题意:给你一个n和一个p,让你用 (2k+p)进制来表示n,找出用最少的(2k+p)来表示n. 分析:首先我们看到2k,首先下想到二进制,我们可以我们列出式子,也就是 (2x1 + p)+(2x2 + ...

  8. c++ 深度优先算法

    #include <iostream> using namespace std; #define VertexNum 9 /*定义顶点数*/ struct Node /*声明图形顶点结构* ...

  9. spring boot打成可执行jar

    第一步 添加 <packaging>jar</packaging> 第二步添加 <build> <plugins> <plugin> < ...

  10. render_template()的各种用法

    1.可以有很多个参数,第一个一定是模板的名字 2.可以传字典.列表.单个变量等等,还可以传函数,在模板中调用函数 后端函数: from flask import Flask from flask im ...