2022 ICPC Gran Premio de Mexico 1ra Fecha (B、D、E、F)
小技巧:
stoi(str,0,2) 将从0开始的二进制串转化为十进制串
不是标准函数,慎用(一般应该没问题吧……)
本次补的题应该都是铜、银牌题,可能欧洲场简单很多
D. Different Pass a Ports
好久没做快速幂的题目了,换了个题目背景,差点没看出来。
分析:
1.只要存在双向线路,便可去往别的港口,但不能停着不动。
2.港口间可重复访问。线路便可看作对矩阵的初始化。从港口1开始,需要初始化一个值为1的矩阵,每次对线路进行选择,即乘上初始化的矩阵。
分析下来,可简化为矩阵1*线路矩阵^k^
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
//const int N=7e5+5;
const int inf=1e18;
const int mod=1e9+7;
int fac[40];
int qpow(int a,int b){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int getinv(int x){return qpow(x,mod-2);}
int C(int a,int b)
{return (fac[a]*getinv(fac[a-b])%mod)*getinv(fac[b])%mod;
}
int n,m,k;
struct Matrix
{static const int N=102; //开设的矩阵int a[N][N];Matrix(int e=0) //矩阵清0{for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)a[i][j]=e*(i==j);}Matrix mul(Matrix A,Matrix B) //矩阵的乘法运算 A*B{Matrix ans(0); //初始化全为0的矩阵for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){for (int k=1;k<=n;k++){ //模拟乘法运算ans.a[i][j]=(ans.a[i][j]+A.a[i][k]*B.a[k][j])%mod;}}}return ans; //返回}Matrix ksm(Matrix A,int b){Matrix ans(1); //初始化为1的矩阵while (b){if (b&1)ans=mul(ans,A); //快速幂A=mul(A,A);b>>=1;}return ans;}
};
Matrix A;
void solve()
{cin>>n>>m>>k;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;A.a[u][v]=1;A.a[v][u]=1;}Matrix B=A.ksm(A,k);int ans=0;for(int i=1;i<=n;i++)ans=(ans+B.a[1][i])%mod;cout<<ans<<endl;
}
signed main()
{ios;//int T;cin>>T;//while(T--)solve();return 0;
}
B. Building 5G antennas
思路:
1.f[v][dis]表示点v,对于当天的距离为j,最早可到达的天数。
2.使用set容器记录前一天可连接点的最小值,此处利用了set的自动排序功能。
3.每次将当天可到达的点记录下,压入到队列中,在都放入集合中。
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e5+5;
const int inf=1e18;
const int mod=1e9+7;
int fac[40];
int qpow(int a,int b){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int getinv(int x){return qpow(x,mod-2);}
int C(int a,int b)
{return (fac[a]*getinv(fac[a-b])%mod)*getinv(fac[b])%mod;
}
int n,k,f[N][105];
struct node
{int x,dis,fa;
};
bool vis[N];
vector<int>e[N],ans;
set<int>st;queue<node>q;void solve()
{cin>>n>>k;for(int i=1;i<n;i++){int u,v;cin>>u>>v;e[u].push_back(v),e[v].push_back(u);}for(int i=1;i<=n;i++) for(int j=0;j<105;j++) f[i][j]=inf;vis[1]=1;st.insert(1); //set容器默认将小值放前面for(int i=0;i<n;i++) //每天建造的网线{if(!st.size()) break;int x=*st.begin();st.erase(st.begin());q.push({x,0,0});f[x][0]=i+1;ans.push_back(x);while(!q.empty()){auto tmp=q.front();int u=tmp.x,dis=tmp.dis;q.pop();if(!vis[u]){vis[u]=1;st.insert(u);}if(dis<k){for(int v:e[u]){if(v==tmp.fa) continue;if(f[v][dis+1]>f[u][dis]){f[v][dis+1]=f[u][dis];q.push({v,dis+1,u});}}}}}for(int x:ans) cout<<x<<" ";cout<<endl;
}
signed main()
{ios;//int T;cin>>T;//while(T--)solve();return 0;
}
E. Erudite of words
思路:
1.本题为数学推公式的题目。在M个字母中选取K个字母构成长度为N的字符串的方案数。
2.首先能想到从M个字母中选取k个字母为方案数为C(m,k)
3.长度为n,将k个字母随机放到n个位置。求出由k个字母构成的总方案数减去由c个字母构成的字符串(c<k)
4.f[i]表示由i个字母构成的长度为n的字符串。f[i]=i^n^-(1~j)*C(i,j)*f[j]的累加和
5.最后再乘上C(m,k)
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))using namespace std;
const int N=1e6+5;
const int inf=1e18;
const int mod=1e9+7;
int n,m,k,fac[N],f[5005],inv[N];
int qpow(int a,int b){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int getinv(int x){return qpow(x,mod-2);}
int C(int a,int b)
{return (fac[a]*inv[a-b]%mod)*inv[b]%mod;
}
void init()
{fac[0]=1;for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%mod;/* 线性求逆元 受数据范围限制inv[1]=1;for(int i=2;i<n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;*/inv[N]=getinv(fac[N]);for(int i=N-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}
void solve()
{init();cin>>n>>m>>k;for(int i=1;i<=k;i++){f[i]=qpow(i,n)%mod;for(int j=1;j<i;j++)f[i]=(f[i]-C(i,j)*f[j]%mod+mod)%mod;}cout<<f[k]*C(m,k)%mod<<endl;
}
signed main()
{ios;//int T;cin>>T;//while(T--)solve();return 0;
}
矩阵快速幂使用情况:
1.数据规模很大
2.有递推公式
F. Froginald the frog
需要再打一个表,能省很多时间。不然每一段都要进行一次快速幂,会tle。看的一篇题解也tle了,数据更新了,需要打表优化下。明天试试
优化后,多过了20多组样例,时间上没问题了,但runtime error了,不知道为啥。
思路:
1.被多个点分成了多个区间,答案为各个区间得累乘。
2.当两个点值差值为1时,到不了终点;为2、3时,只有一种情况;差值为4时有2种情况,符合斐波那契,eg:4、8,可行区间为【5,7】
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))using namespace std;
const int N=2e6+5;
const int inf=1e18;
const int mod=1e9+7;
int n,m,a[N],ans[N];
struct Matrix
{static const int N=3; //开设的矩阵int a[N][N];int n=2;Matrix(int e=0) //矩阵清0{for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)a[i][j]=e*(i==j);}Matrix mul(Matrix A,Matrix B) //矩阵的乘法运算 A*B{Matrix ans(0); //初始化全为0的矩阵for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){for (int k=1;k<=n;k++){ //模拟乘法运算ans.a[i][j]=(ans.a[i][j]+A.a[i][k]*B.a[k][j])%mod;}}}return ans; //返回}Matrix ksm(Matrix A,int b){Matrix ans(1); //初始化为1的矩阵while (b){if (b&1)ans=mul(ans,A); //快速幂A=mul(A,A);b>>=1;}return ans;}
};void solve()
{Matrix A;A.a[1][1]=A.a[1][2]=A.a[2][1]=1;cin>>n>>m;for(int i=1;i<=m;i++) cin>>a[i];Matrix B(1);for(int i=1;i<=N;i++){B=B.mul(B,A);ans[i]=(B.a[1][1]+B.a[1][2])%mod;}sort(a+1,a+m+1);a[0]=-1;m++,a[m]=n+1;int ss=1;for(int i=1;i<=m;i++){if(a[i]-a[i-1]==1){cout<<0<<endl;return;}else if(a[i]-a[i-1]==2||a[i]-a[i-1]==3)continue;else{ss=ss*ans[a[i]-a[i-1]-3]%mod;}}cout<<ss<<endl;
}
signed main()
{ios;//int T;cin>>T;//while(T--)solve();return 0;
}
2022 ICPC Gran Premio de Mexico 1ra Fecha (B、D、E、F)相关推荐
- 2022 ICPC Gran Premio de Mexico 1ra Fecha(一)
今天大部分时间都花在了上一场沈阳站的L题上了,一个树上背包+容斥原理,看了好久才理解,就不硬敲上了,再想几天在写题解.然后今天自己写了场ICPC墨西哥站的 ICPC Gran Premio de Me ...
- 2022 ICPC Gran Premio de Mexico 1ra Fecha 题解
A 线性基 由于数组异或和固定,因此异或和为奇数的位置可以不用考虑,无论如何分,总是只能有1个为奇数,总贡献不变. 考虑异或和为偶数的位置,利用线性基求其中一部分尽可能大的结果,另一部分结果相同. # ...
- 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha
2022 ICPC Gran Premio de Mexico 2da Fecha 2022.10.3 之前训得ak场,个人认为很edu. (顺便一提,可能这个训练记录番外系列的比赛都非常edu,十分 ...
- 2021 ICPC Gran Premio de Mexico 1ra Fecha
C.Cypher Decypher 题意 找 [ i , j ] [i,j] [i,j]区间中有多少个质数 思路 数据范围为 1 ≤ i ≤ j ≤ 1 0 6 1\le i\le j\le 10^6 ...
- 2022 ICPC Gran Premio de Mexico 2da Fecha Final standings - K. Krystalova‘s Trivial Problem
K. Krystalova's Trivial Problem time limit per test1 second memory limit per test256 megabytes input ...
- 2023 ICPC Gran Premio de Mexico 1ra Fecha
待更新 目录 1 A Aliases B Bucket storing D Dynamic Collection E Employees Bonus G Growing game J Jumping ...
- 2022 ICPC Gran Premio de Mexico Repechaje 题解
目录 A. Average Walk(签到) 题意: 思路: 代码: C. Company Layoffs(签到) 题意: 思路: 代码: D. Denji1(模拟/二分) 思路: 代码: K. Ke ...
- 【2021 ICPC Gran Premio de Mexico 2da Fecha F】Flipped Factorization 题解
题目大意 设 x x x 的质因数分解为 p 1 c 1 p 2 c 2 ⋯ p m c m p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m} p1c1p2c2⋯pmc ...
- 2021 ICPC Gran Premio de Mexico 2da Fecha(C,D,G,I)
题目 C. Cut the Deck D. Dislike the Raisins G. Grid of Letters I. Integer Multiplicative Persistence C ...
最新文章
- 网关技术选型,为什么选择 Openresty ?事件驱动、协程...
- 《Cortex-M0权威指南》之体系结构---异常和中断
- 【笔记】HMM在股票指数中的简单应用
- Java基本sql_常用sql
- wirkshark过滤规则
- K8S_Google工作笔记0011---通过二进制方式_为APIServer生成自签证书
- 2021年中国电力线通信(PLC)市场趋势报告、技术动态创新及2027年市场预测
- 解决Axure发布分享预览的3个方法
- [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料(3)
- 线段树(区间合并) HDOJ 3308 LCIS
- 运行成功:char转换为wchar_t的代码
- IEEE Access投稿(Latex模板)——参考文献的生成
- 指数型基金今年来收益排行榜
- Nginx ACCESS日志过滤CSS JS 图片等静态文件——筑梦之路
- 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点
- javascript---对象和函数的引用、浅拷贝、深拷贝、递归
- 计算机毕业设计JavaWeb企业客户管理系统(源码+系统+mysql数据库+lw文档)
- MOVS,LODS,CMPS,SCAS,STOS
- word文件图标无法显示的问题
- Boosting(一)
热门文章
- html输入公式得到混合运算结果,excel表格如何用公式计算加减乘除混合运算-excel乘法如何计算,excel函数怎么计算乘法...
- 微信罕见出手,再造一个万能的电商平台!
- 房贷没放款前千万不要做的事
- 异常篇 之 记录一次因“MIUI 优化”引发的无奈。。。
- 【读书向】阿里云天池大赛赛题解析——可视化
- jedisPool相关参数说明
- Golang 字符串拼接
- Hdu 1496 Equations(巧妙哈希)
- 数字电路3(逻辑函数的卡诺图化简法)
- 名帖205 蔡襄 行书《蔡襄自书诗》