显然只可以在标号为7的倍数的操作时使得\(a\),\(b\),\(c\)都变为0
每7次造成的伤害数是9,由于伤害打满了,所以 \(9|(a+b+c)\)
同时又因为需要每七次操作至少会让每个数减1,所以 \(min(a,b,c)>=(a+b+c)/9\)
//I love Nanami Chiaki
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define fst first
#define snd second
const int inf=1e9+7;
const int mod=1e9+7;
//const int maxn=;
int main(){
int T_T;scanf("%d",&T_T);
while (T_T--){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
int mn=min(min(a,b),c);
if ((a+b+c)%9==0 && (a+b+c)/9<=mn) puts("YES");
else puts("NO");
}
return 0;
}
看到题目满脸懵逼
但有个式子可以先推推看
不妨单独考虑\(a_i\),则
注意到如果满足上面这个式子,那么原式一定满足
又因为要满足 \(b_i|b_{i+1}\)或\(b_{i+1}|b_i\)
考虑所有\(b_i\)都可以表示为\(2^k\),发现必存在
所以当\(b_i\)取小于等于\(a_i\)最大的2的整数幂,即满足题意
//I love Nanami Chiaki
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define fst first
#define snd second
const int inf=1e9+7;
const int mod=1e9+7;
const int maxn=57;
int a[maxn];
int main(){
int T_T;scanf("%d",&T_T);
while (T_T--){
int n;scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",a+i);
for (int i=0;i<n;i++){
for (int k=0;k<32;k++){
if (((a[i]-1)/2+1)<=(1<<k)){
printf("%d%c",(1<<k),(i==n-1)?‘\n‘:‘ ‘);
break;
}
}
}
}
return 0;
}
原文:https://www.cnblogs.com/xxjAc/p/14191193.html