小技巧:
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)相关推荐

  1. 2022 ICPC Gran Premio de Mexico 1ra Fecha(一)

    今天大部分时间都花在了上一场沈阳站的L题上了,一个树上背包+容斥原理,看了好久才理解,就不硬敲上了,再想几天在写题解.然后今天自己写了场ICPC墨西哥站的 ICPC Gran Premio de Me ...

  2. 2022 ICPC Gran Premio de Mexico 1ra Fecha 题解

    A 线性基 由于数组异或和固定,因此异或和为奇数的位置可以不用考虑,无论如何分,总是只能有1个为奇数,总贡献不变. 考虑异或和为偶数的位置,利用线性基求其中一部分尽可能大的结果,另一部分结果相同. # ...

  3. 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha

    2022 ICPC Gran Premio de Mexico 2da Fecha 2022.10.3 之前训得ak场,个人认为很edu. (顺便一提,可能这个训练记录番外系列的比赛都非常edu,十分 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 2022 ICPC Gran Premio de Mexico Repechaje 题解

    目录 A. Average Walk(签到) 题意: 思路: 代码: C. Company Layoffs(签到) 题意: 思路: 代码: D. Denji1(模拟/二分) 思路: 代码: K. Ke ...

  8. 【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} p1c1​​p2c2​​⋯pmc ...

  9. 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 ...

最新文章

  1. 网关技术选型,为什么选择 Openresty ?事件驱动、协程...
  2. 《Cortex-M0权威指南》之体系结构---异常和中断
  3. 【笔记】HMM在股票指数中的简单应用
  4. Java基本sql_常用sql
  5. wirkshark过滤规则
  6. K8S_Google工作笔记0011---通过二进制方式_为APIServer生成自签证书
  7. 2021年中国电力线通信(PLC)市场趋势报告、技术动态创新及2027年市场预测
  8. 解决Axure发布分享预览的3个方法
  9. [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料(3)
  10. 线段树(区间合并) HDOJ 3308 LCIS
  11. 运行成功:char转换为wchar_t的代码
  12. IEEE Access投稿(Latex模板)——参考文献的生成
  13. 指数型基金今年来收益排行榜
  14. Nginx ACCESS日志过滤CSS JS 图片等静态文件——筑梦之路
  15. 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点
  16. javascript---对象和函数的引用、浅拷贝、深拷贝、递归
  17. 计算机毕业设计JavaWeb企业客户管理系统(源码+系统+mysql数据库+lw文档)
  18. MOVS,LODS,CMPS,SCAS,STOS
  19. word文件图标无法显示的问题
  20. Boosting(一)

热门文章

  1. html输入公式得到混合运算结果,excel表格如何用公式计算加减乘除混合运算-excel乘法如何计算,excel函数怎么计算乘法...
  2. 微信罕见出手,再造一个万能的电商平台!
  3. 房贷没放款前千万不要做的事
  4. 异常篇 之 记录一次因“MIUI 优化”引发的无奈。。。
  5. 【读书向】阿里云天池大赛赛题解析——可视化
  6. jedisPool相关参数说明
  7. Golang 字符串拼接
  8. Hdu 1496 Equations(巧妙哈希)
  9. 数字电路3(逻辑函数的卡诺图化简法)
  10. 名帖205 蔡襄 行书《蔡襄自书诗》