牛客白月赛5 题解 数学场

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛5 题解 数学场相关的知识,希望对你有一定的参考价值。

数学场
https://ac.nowcoder.com/acm/contest/135#question

目录

无关(relationship)【容斥】

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=25;
LL l,r,n,a[N];
LL solve(LL x)

	LL sum=0;
	for(int i=1;i<(1<<n);i++)
	
		LL temp=x,cnt=-1;
		for(int j=0;j<n;j++)
		
			if((i>>j)&1==1) temp/=a[j],cnt=cnt*(-1);
		
		sum=sum+cnt*temp;
	
	return x-sum;

int main(void)

	cin>>l>>r>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	cout<<solve(r)-solve(l-1);
	return 0;

范围(range)【不会】

水题(water)【不会】

阶乘(factorial)【思维 末尾0的个数】


2*5==10 2的个数一定大于5的个数。故就是求5的个数。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL sum,n,cnt;
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++)
	
		int j=i;
		while(j%5==0) cnt++,j/=5;
		sum+=cnt;
	
	cout<<sum;
	return 0; 
 

面积(area)【不会】

圆(circle)【n个点将圆分成几部分】


#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)

	LL n;
	while(cin>>n)	
	
		LL sum=0;
		if(n>=4) sum+=n*(n-1)*(n-2)*(n-3)/4/3/2;
		if(n>=2) sum+=n*(n-1)/2;
		sum++;
		cout<<sum<<endl;
	
	return 0; 
 

异或(xor)

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL n;
int main(void)

	while(scanf("%lld",&n)!=-1) printf("%lld\\n",n/3*2+n%3);
	return 0;

最大公约数(lcm)

#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 a,b; cin>>a>>b;
	cout<<a/gcd(a,b)*b;
	return 0;

区间 (interval)【差分】

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*3+10;
typedef long long int LL;
LL n,m,x,a[N];
void add(int l,int r,int x)

	a[l]+=x;
	a[r+1]-=x;	

int main(void)
 
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>x,add(i,i,x);
	while(m--)
	
		LL op,l,r,p; cin>>op>>l>>r>>p;
		if(op!=1) add(l,r,p);
		else add(l,r,-p);
	
	for(int i=1;i<=n;i++) a[i]+=a[i-1];
	LL sum=0,l,r;
	cin>>l>>r;
	for(int i=l;i<=r;i++) sum+=a[i];
	cout<<sum<<endl;
	return 0;

时间(time)【模拟】

#include<bits/stdc++.h>
using namespace std;
bool check(int x,int y)

	int a1=x/10,a2=x%10;
	int b2=y/10,b1=y%10;
	if(a1==b1&&a2==b2) return true;
	return false;

int main(void)

	string s; cin>>s;
	int a,b;
	a=stoi(s.substr(0,s.find(':')));
	b=stoi(s.substr(s.find(':')+1));
	int x=0,y=0;
	for(int i=0,j=0;;j++)
	
		if(j==60) j=0,i++;
		if(i==a&&j==b) break;
		if(check(i,j)) x=i,y=j;
	
	printf("%d:%d\\n",x,y);
	x=0,y=0;
	for(int i=a,j=b+1;;j++)
	
		if(j==60) j=0,i++;
        if(i==24) break;
		if(check(i,j)) 
        
            x=i,y=j;
            break;
        
	
	printf("%d:%d\\n",x,y);
	return 0;

以上是关于牛客白月赛5 题解 数学场的主要内容,如果未能解决你的问题,请参考以下文章

牛客白月赛12题解

牛客白月赛8题解

牛客白月赛9题解

牛客白月赛26题解

牛客白月赛14题解

牛客白月赛25题解