牛客小白月赛 5

A题

容斥定理
详细题解

#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100;
int k;
ll ans[maxn];
ll solve(ll a)
{
    if(a==0) return 0;
    ll num=a;
    for(int i=1;i<(1<<k);i++)
    {  
        int cnt=0;
        ll mul=1;
        bool isok=true;
        for(int j=0;j<k;j++)
        {
            if(i&(1<<j))
            {
                cnt++;
                if(a/mul<ans[j]){

                    isok=false;
                    break;
                }
                mul*=ans[j]; 
            }
        }
        if(isok)
        {
            if(cnt%2) 
                num-=a/mul;
            else 
                num+=a/mul;
        }
    }
    return num;
}

int main(){
    ll l,r;
    scanf("%lld%lld%d",&l,&r,&k);
    for(int i=0;i<k;i++) 
        scanf("%lld",&ans[i]);
    printf("%lld\n",solve(r)-solve(l-1));
} 

B题

C题

D题

判断5的个数就好;注意题目是阶乘的乘积,所以要把每个阶乘的5个数搞出来

#include<iostream>
#include<math.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    cin>>n;
    if(n<=4)
        cout<<0;
    else
    {
        ll sum=0;
        ll cnt;
        for(int i=5;i<=n;i+=5)
        {
            cnt=0;
            ll z=i;
            while(z%5==0)
            {
                cnt++;
                z/=5;
            }
            sum+=(n-i+1)*cnt;
        }
        cout<<sum;
    }
}

E题

F题

欧拉公式,平面圆域分割

#include<iostream>
using namespace std;
typedef long long int ll;
int main()
{
    ll n;
    ll k;
    while(cin>>n)
    {
        k=n*(n-1)*(n-2)*(n-3)/24+n*(n-1)/2+1;
        cout<<k<<endl;
    }
    
}

G题

斐波那契数列

#include<iostream>
using namespace std;
typedef long long int ll;
int main()
{
    ll n;
    while(cin>>n)
    {
        ll ans=(n/3)*2+n%3;
        cout<<ans<<endl;
    }
}

H题

签到题

#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef unsigned long long int ull;
int main()
{
    ull a,b;
    cin>>a>>b;
    cout<<a/__gcd(a,b)*b<<endl;
}

I题

前缀和,差分的运用

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long int ll;
const int maxn=1e6+5;
ll a[maxn];
ll d[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        d[i]=a[i]-a[i-1];
    }
    int q,l,r,p;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&q,&l,&r,&p);
        if(q!=1)
        {
            d[l]+=p;
            d[r+1]-=p;
        }
        else
        {
            d[l]-=p;
            d[r+1]+=p;
        }
    }
    for(int i=1;i<=n;i++)
    {
        d[i]+=d[i-1];
    }
    for(int i=1;i<=n;i++)
    {
        d[i]+=d[i-1];
    }
    int zl,zr;
    cin>>zl>>zr;
    cout<<d[zr]-d[zl-1];
}

J题

模拟题,用分的阶段去判断小时,如果小时的回文分钟大于60分钟,小时–或++任何重复操作就行

#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    int a,b;
    char s;
    while(cin>>a>>s>>b)
    {
        if(a==6||a==7||a==8||a==9)
        {
            cout<<"5:50"<<endl;
            cout<<"10:1"<<endl;
        }
        else if(a==16||a==17||a==18||a==19)
        {
            cout<<"15:51"<<endl;
            cout<<"20:2"<<endl;
        }
        else if(a==0)
        {
            if(b==0)
            {
                cout<<"23:32"<<endl;
            }
            else
            {
                cout<<"0:0"<<endl;
            }
            cout<<"1:10"<<endl;
        }
        else if(a==23)
        {
            if(b<32)
            {
                cout<<"22:22"<<endl;
                cout<<"23:32"<<endl;
            }
            else if(b==32)
            {
                cout<<"22:22"<<endl;
                cout<<"0:0"<<endl;
            }
            else
            {
                cout<<"23:32"<<endl;
                cout<<"0:0"<<endl;
            }
        }
        else
        {
            int c,d;
            c=a;
            d=c%10*10+c/10;//取回文数
            if(d<b)
            {
                printf("%d:%d\n",c,d);
            }
            else
            {
                c--;
                d=c%10*10+c/10;
                while(d>=60)
                {
                    c--;
                    d=c%10*10+c/10;
                }
                printf("%d:%d\n",c,d);
            }
            c=a;
            d=c%10*10+c/10;
            if(d>b&&d<60)
                printf("%d:%d",c,d);
            else
            {
                c++;
                d=c%10*10+c/10;
                while(d>=60)
                {
                    c++;
                    d=c%10*10+c/10;
                }
                printf("%d:%d",c,d);
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值