个人题解 |

这场怎么全是细节和数学(

E减的时候忘了先加个mod,喜提270。。。

A

签到

B

只需要找到一个相同的字母即可

C

细节很多,需要特判

首先,当有一种颜色的气球比其他所有气球的数量加起来还大的话,显然只能剩下这种颜色的气球;

然后,当有一种颜色的气球与其他所有气球的数量相等的话,如果n==2,那么最终剩余气球为0,否则剩余1;

如果这两种情况都不符合的话,对于每一个a[i],判断一下除了i之外其他气球的数量和:

如果和为偶数的话,显然其他气球可以自己碰撞然后消失掉,第i种颜色的气球就可以留下;

如果为奇数,那么最少只会剩下一个气球,只要a[i]大于1的话,第i种颜色的气球就有可能留下;

#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
#define li __int128
ll a[200005];
int main(){
	int n;cin>>n;
    ll sum=0;
    ll maxn=0;
    set<ll>st;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
        maxn=max(a[i],maxn);
    }
    int kinds=0;
    for(int i=1;i<=n;i++){
        if((sum-a[i])%2==0||(sum-a[i])%2==1&&a[i]>1){
            kinds++;
        }
    }
    if(maxn>sum-maxn){
        cout<<1<<'\n';
    }
    else if(maxn==sum-maxn){
        if(n>2){
            cout<<1<<'\n';
        }
        else{
            cout<<0<<'\n';
        }
    }
    else{
        cout<<kinds;
    }
	return 0;
}

D

打表,发现每10个数字里面只有6个好数

#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
#define li __int128
inline __int128 read(){
    __int128 x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

inline void print(__int128 x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)
        print(x/10);
    putchar(x%10+'0');
}
void solve(){
    li n;n=read();
    li x=n/6;
    li now=x*10;
    li num=x*6;
    if(n%6==0){
        x=n/6-1;
        now=x*10;
        num=x*6;
    }
    //cout<<num<<'\n';
    for(li i=now;;i++){
        if(i%3!=0&&i%10!=3){
            num++;
            if(num>=n){
                print(i);
                cout<<'\n';
                break;
            }
        }
    }
}

int main(){
//     for(int i=1;i<=100;i++){
//         if(i%3!=0&&i%10!=3){
//             cout<<i<<' ';
//         }
//     }
	int _;cin>>_;
    while(_--){
        solve();
    }
	return 0;
}

E

简单容斥,横轴对称的+纵轴对称的-都对称的。也是细节很多:

首先减法取模可能出现负数,故应先加mod再减再mod;

然后注意101这种不是沿纵轴对称的!注意对1的判断。

#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
#define li __int128
const ll mod=1e9+7;
ll qpow(ll a, ll n){
    ll ans = 1;
    while(n){
        if(n&1)        
            ans = (ans * a) % mod;  
        a = (a * a) % mod;       
        n >>= 1;       
    }
    return ans;
}
int main(){
	ll n;cin>>n;
    if(n%2==0){
        ll sum1=qpow(4,n)%mod;
        ll sum2=qpow(4,n/2)%mod;
        ll sum3=qpow(2,n/2)%mod;
        cout<<(sum1+sum2-sum3+mod)%mod;
    }
    else{
        ll sum1=qpow(4,n);
        ll sum2=(qpow(4,n/2)*2ll)%mod;
        ll sum3=(qpow(2,n/2)*2ll)%mod;
        cout<<(sum1+sum2-sum3+mod)%mod;
    }
	return 0;
}
全部评论
你的C有问题, HACK数据: 3 1 1 2 这个应该输出1,但是你的代码输出的是0
点赞 回复 分享
发布于 06-17 22:22 四川
有个地方需要修改: ```cpp if (mx == sum - mx) { if((n-1)%2==1){ cout << "0\n"; }else { cout<<"1\n"; } return; } ```
点赞 回复 分享
发布于 06-17 22:32 四川

相关推荐

牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务