牛客白月赛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题解的主要内容,如果未能解决你的问题,请参考以下文章

牛客白月赛4 题解

牛客白月赛11题解

牛客白月赛12题解

牛客白月赛10题解

牛客白月赛14题解

牛客白月赛32题解