牛客白月赛28题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛28题解相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/contest/7412
目录
牛牛和牛可乐的赌约【概率】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int mod=1e9+7;
//1-x;
LL qsm(LL a,LL b,LL p)
LL sum=1;
while(b)
if(b&1) sum=sum*a%p;
b>>=1;
a=a*a%p;
return sum%p;
int main(void)
int t; cin>>t;
while(t--)
LL n,m; scanf("%lld%lld",&n,&m);
LL sum=qsm(qsm(n,mod-2,mod),m,mod);
printf("%lld\\n",(1-sum+mod)%mod);
return 0;
牛牛和牛可乐的赌约2【博弈论】
找规律,会发现结果。
#include<bits/stdc++.h>
using namespace std;
int a[3][3]=
1,0,0,
0,1,0,
0,0,1
;
int main(void)
int t; cin>>t;
while(t--)
int x,y; cin>>x>>y;
if(a[x%3][y%3]==0) puts("yyds");
else puts("awsl");
return 0;
单词记忆方法【栈模拟】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
string s;
stack<LL>st;
int main()
cin>>s;
for(int i=0;i<s.size();i++)
if(s[i]=='(') st.push(-1);
else if(s[i]==')')
LL j=i,sum=0;
while(j+1<s.size()&&(s[j+1]>='0'&&s[j+1]<='9'))
j++;
sum=sum*10+s[j]-'0';
sum=max(sum,1ll);
LL ans=0;
while(st.size())
if(st.top()==-1)
st.pop();
break;
ans+=st.top(); st.pop();
st.push(ans*sum);
i=j;
else if(s[i]>='A'&&s[i]<='Z')
LL j=i,sum=0;
while(j+1<s.size()&&(s[j+1]>='0'&&s[j+1]<='9'))
j++;
sum=sum*10+s[j]-'0';
sum=max(sum,1ll);
st.push(sum*(s[i]-'A'+1));
i=j;
LL ans=0;
while(st.size()) ans+=st.top(),st.pop();
cout<<ans;
//((A2B2)2(A3B4)2)2
//68
位运算之谜【思维】
就是我们先将&的剔除掉。剩下的转化成二进制不会和我们&的内容二进制冲突。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)
//std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr);
int t; cin>>t;
while(t--)
LL x,y; cin>>x>>y;
LL temp=y;
bool flag=1;
vector<int>s1,s2;
while(temp)
s1.push_back(temp%2);
temp/=2;
while(s1.size()<63) s1.push_back(0);
LL sum=x-y*2,ans=0;
if(sum<0) flag=0;
if(flag)
while(sum)
s2.push_back(sum%2);
sum/=2;
while(s2.size()<63) s2.push_back(0);
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
for(int i=0;i<s1.size();i++)
if(s1[i]==1&&s2[i]==1) flag=0;//冲突都是1
if(s2[i]==1) ans=ans*2+1;
else ans=ans*2;
if(flag) cout<<ans<<'\\n';
else cout<<-1<<'\\n';
return 0;
牛牛和字符串的日常【KMP】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
int n,m,t;
int ne[N];
string a,b;
int main(void)
cin>>a;
n=a.size();
a="0"+a;
for(int i=2,j=0;i<=n;i++)
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1]) j++;
ne[i]=j;
int t; cin>>t;
LL ans=0;
while(t--)
cin>>b;
m=b.size();
b="0"+b;
int temp=0;
for(int i=1,j=0;i<=m;i++)
while(j&&b[i]!=a[j+1]) j=ne[j];
if(b[i]==a[j+1]) j++;
temp=max(temp,j);
ans+=temp;
cout<<ans;
return 0;
上学要迟到了【建图 最短路】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
typedef pair<LL,int> PII;
int h[N],e[N],ne[N],w[N],idx;
LL st[N],dist[N];
LL n,m,stx,edx,t;
int a[N],b[N];
vector<int>ve[N];
void add(int a,int b,int c)
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
void Dijkstra(int u)
memset(dist,0x3f,sizeof dist);
priority_queue<PII,vector<PII>,greater<PII> > q; q.push(0,u);
dist[u]=0;
while(q.size())
auto temp=q.top(); q.pop();
u=temp.second;
if(st[u]) continue;
st[u]=1;
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(dist[j]>dist[u]+w[i])
dist[j]=dist[u]+w[i];
q.push(dist[j],j);
int main(void)
cin>>n>>m>>stx>>edx>>t;
for(int i=1;i<=m;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i],ve[b[i]].push_back(i);
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++)
for(int j=1;j<ve[i].size();j++) add(ve[i][j-1],ve[i][j],a[i]);
for(int i=2;i<=n;i++) add(i,i-1,t),add(i-1,i,t);
Dijkstra(stx);
cout<<dist[edx];
return 0;
迷宫【DP】
#include<bits/stdc++.h>
using namespace std;
const int N=105;
const int M=10007;
const int mod=1e4+7;
bool f[N][N][M];
int n,m,a[N][N];
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j],a[i][j]=a[i][j]%mod;
f[1][1][a[1][1]]=true;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(i == 1 && j == 1) continue;
for(int k=0;k<mod;k++)
int temp=(k+a[i][j])%mod;
if(f[i-1][j][k]) f[i][j][temp]=true;
if(f[i][j-1][k]) f[i][j][temp]=true;
int cnt=0;
for(int i=0;i<10007;i++) if(f[n][m][i]) cnt++;
cout<<cnt;
return 0;
树上行走【并查集】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
int n,w[N];
int p[N],cnt[N];
int find(int以上是关于牛客白月赛28题解的主要内容,如果未能解决你的问题,请参考以下文章