个人题解 |
这场怎么全是细节和数学(
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;
}