A
https://codeforces.com/contest/1397/problem/A
直接判断各个字母的总个数能否被n整除就行了
#include
int t,n,f=1,a[30];
void rd(){
char ch;
for (scanf("%c",&ch); ch<'a' || ch>'z'; ) scanf("%c",&ch);
for (; ch>='a' && ch<='z'; ) a[ch-'a']++,scanf("%c",&ch);
}
int main(){
scanf("%d",&t);
for (f=1; t; t--,f=1){
for (int i=0; i<26; i++) a[i]=0;
scanf("%d",&n);
for (int i=1; i<=n; i++) rd();
for (int i=0; i<=25; i++) if (a[i]%n!=0){
printf("NO\n");
f=0;
break;
}
if (f) printf("YES\n");
}
}
B
感受一下,c不会很大,直接枚举c,判断一下即可。
#include
#include
using namespace std;
long long i,n,c,cnt,ans,C,a[100005];
int main(){
scanf("%lld",&n);
ans=-n;
for (i=1; i<=n; i++) scanf("%lld",&a[i]),ans+=a[i];
sort(a+1,a+n+1);
for (c=1; c<=1000000; c++){
cnt=0;
for (i=1,C=1; i<=n; i++,C*=c){
if (C>a[i]) cnt+=C-a[i]; else cnt+=a[i]-C;
if (cnt>=ans) break;
}
if (cnt
C
https://codeforces.com/contest/1397/problem/C
解法可能不唯一
1.我是先把第一个数(a[1])直接减掉,
2.然后再以[2,n]区间操作一次,
3.最后以[1,n]区间操作一次。
想想就会发现这样是可行的(只要数据有解,这样就一定是能满足的解)
可以这样解释:
后两步将[2,n]归零,相当于 a[i]=A*(n-1)+B*n,对任意i只需A,B为整数,这当然是都有解的,而且有很多解,随便推个满足的简单的式子就行了。
#include
long long A[100005],B[100005],a[100005],x,n;
int main(){
scanf("%lld",&n);
x=n-1;
for (int i=1; i<=n; i++) scanf("%lld",&a[i]);
for (int i=2; i<=n; i++){
A[i]=-a[i]%n;
B[i]=(a[i]+A[i])/n-A[i];
}
printf("1 1\n%lld\n",-a[1]);
a[1]=0;
if (n==1){
printf("1 1\n0\n1 1\n0");
return 0;
}
printf("2 %lld\n",n);
for (int i=2; i<=n; i++) printf("%lld ",-A[i]*x),a[i]-=A[i]*x;
printf("\n1 %lld\n",n);
for (int i=1; i<=n; i++) printf("%lld ",-a[i]);
}
D
https://codeforces.com/contest/1397/problem/D
打表找规律……
#include
#include
using namespace std;
int t,n,a[200],S,T,HL;
int main(){
scanf("%d",&t);
while (t--){
//T=HL=0;
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
S=0;
for (int i=1; iHL) printf("T\n");
//else printf("HL\n");
*/
}
}
E
emmmmm
没有做……