Codeforces Round #697 (Div. 3)
A.Odd Divisor
题意:问一个数是不是含有奇数因子
思路:就直接给这个数循环除以2,看看最后剩下的数是不是0,如果不是就有奇数因子,如果是就没有
想不到:1)当时想着用log2来解决问题,后来发现好像这种想法有点偏
代码:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const long long int maxx=2e5+10; 9 int a[maxx]; 10 long long int b[maxx]; 11 int main(){ 12 long long int t; 13 scanf("%lld",&t); 14 while(t--){ 15 __int64 n; 16 scanf("%I64d",&n); 17 if(n==1){ 18 printf("NO\n"); 19 }else{ 20 while(n%2==0){ 21 n/=2; 22 } 23 if(n>1){ 24 printf("YES\n"); 25 }else{ 26 printf("NO\n"); 27 } 28 } 29 } 30 }
B. New Year's Number
题意:问某个数是不是可以由2020和2021构成
思路:直接进行while循环,先进行一个一个的除2021,直到2021褚不开,看看每一次是不是能够%2020魏0,如果出现一次就是可以用他们构成
想错:1)当时第一次想的时候就是简单的进行先除2021再看看余数是不是2020,其实这样就定下了2020只能有一个,这样的思路就是不对的,可能往往最简单的办法,最笨的方法最有效
代码:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const long long int maxx=2e5+10; 9 int a[maxx]; 10 long long int b[maxx]; 11 int main(){ 12 long long int t; 13 scanf("%lld",&t); 14 while(t--){ 15 int n; 16 scanf("%d",&n); 17 int flag=0; 18 while(n>=2020){ 19 if(n%2020==0){ 20 flag=1; 21 break; 22 } 23 n-=2021; 24 } 25 if(flag==1||n==0){ 26 printf("YES\n"); 27 }else{ 28 printf("NO\n"); 29 } 30 } 31 }
C. Ball in Berland
题意:就是有a个女生,b个男生,然后构成的小组有k个,从中选取任意两组,问能组成多少组,注意着两组中必须是不同的四个人
思路:定一动一,从头开始先固定一组,然后用总人数减去女生a组成的组数再减男生b组成的组数+1,这样就是第二组的选取
想错:1)当时想用组合数学,发现第四个样例因为需要n*(n-1)可能是太大了,出现了数位不对的状况;2)遍历这几组人的时候,一开始没想对到底是怎么遍历,第一次用了人的编号去遍历出现了错误,应该是从边遍历,才能保证第一组就是对的,这样才会省掉时间和空间
代码:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const long long int maxx=2e5+10; 9 long long int aa[maxx]; 10 long long int bb[maxx]; 11 //long long int s[maxx][maxx]; 12 int main(){ 13 long long int t; 14 scanf("%lld",&t); 15 while(t--){ 16 long long int ap,bp,k; 17 scanf("%lld %lld %lld",&ap,&bp,&k); 18 long long int a[maxx]={0}; 19 long long int b[maxx]={0}; 20 for(int i=0;i<k;i++){ 21 scanf("%lld",&aa[i]); 22 a[aa[i]]++; 23 } 24 25 for(int i=0;i<k;i++){ 26 scanf("%lld",&bb[i]); 27 b[bb[i]]++; 28 } 29 long long int sum=(k-1)*k/2;// 30 for(int i=1;i<=ap;i++){ 31 if(a[i]>1){ 32 sum-=(a[i]-1)*a[i]/2; 33 } 34 } 35 for(int i=1;i<=bp;i++){ 36 if(b[i]>1){ 37 sum-=(b[i]-1)*b[i]/2; 38 } 39 } 40 printf("%lld\n",sum); 41 for(int i=0;i<k;i++){ 42 aa[i]=0; 43 bb[i]=0; 44 } 45 } 46 }