牛客白月赛9题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛9题解相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/contest/275
难度挺大的,线段树和数学这方面有点薄弱。有时间补吧。
目录
签到【数学 概率】
直接考虑掉下的概率很麻烦,但是求不掉的概率很容易。1-不掉的概率 就是掉的概率
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int mod=1e9+7;
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)
LL n; cin>>n;
LL sum1=1,sum2=1,sum3=1;// sum2=b1*b2*b3...的逆元 sum3=b1*b2*b3...
while(n--)
LL a,b; cin>>a>>b;
sum1=sum1*(b-a)%mod;
sum2=sum2*qsm(b,mod-2,mod)%mod;
sum3=sum3*b%mod;
cout<<(sum3-sum1+mod)%mod*sum2%mod;
return 0;
法法 【思维】
思维,当n=1时,输出1。当n=2时还是输出1。
当n>=3时,其实对于偶数为底的一定为偶数。奇数为底的例如以3为底的个数为 2!个一定为偶数。故结果也一定时偶数。
故都是偶数。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int LL;
int main(void)
LL t; cin>>t;
while(t--)
LL n; cin>>n;
LL cnt=n-n/2;
if(n>2) puts("0");
else puts("1");
return 0;
换个角度思考【区间小于等于x的个数】
这里是分块搞的,树状数组线段树也是可以的。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],ad[N],id[N],n,m,len;
vector<LL>ve[N];
void solve(int x)
ve[x].clear();
for(int i=(x-1)*len+1;i<=min(x*len,n);i++) ve[x].push_back(a[i]);
sort(ve[x].begin(),ve[x].end());
void add(LL l,LL r,LL c)
for(int i=l;i<=min(r,id[l]*len);i++) a[i]+=c;
solve(id[l]);
if(id[l]==id[r]) return;
for(int i=id[l]+1;i<=id[r]-1;i++) ad[i]+=c;
for(int i=(id[r]-1)*len+1;i<=r;i++) a[i]+=c;
solve(id[r]);
LL query(LL l,LL r,LL x)
int ans=0;
for(int i=l;i<=min(r,id[l]*len);i++) if(a[i]+ad[id[i]]<x) ans++;
if(id[l]==id[r]) return ans;
for(int i=id[l]+1;i<=id[r]-1;i++)
int c=x-ad[i];
ans+=lower_bound(ve[i].begin(),ve[i].end(),c)-ve[i].begin();
for(int i=(id[r]-1)*len+1;i<=r;i++) if(a[i]+ad[id[i]]<x) ans++;
return ans;
int main(void)
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
len=sqrt(n);
for(int i=1;i<=n;i++)
id[i]=(i-1)/len+1;
ve[id[i]].push_back(a[i]);
for(int i=1;i<=id[n];i++) sort(ve[i].begin(),ve[i].end());
while(m--)
int l,r,c; cin>>l>>r>>c;
cout<<query(l,r,c+1)<<'\\n';
return 0;
论如何出一道水题【gcd】
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int LL;
LL gcd(LL a,LL b)return b?gcd(b,a%b):a;
int main(void)
LL n; cin>>n;
for(LL i=n;i;i--)
if(gcd(n,i)==1)
cout<<n+i<<endl;
return 0;
return 0;
你会发现 gcd(n,n-1)==1
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL gcd(LL a,LL b)return b?gcd(b,a%b):a;
int main(void)
LL n; cin>>n;
n=n+max(n-1,1ll);
cout<<n;
return 0;
以上是关于牛客白月赛9题解的主要内容,如果未能解决你的问题,请参考以下文章