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 }
View Code

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 }
View Code

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 }
View Code

 

posted @ 2021-01-28 10:35  bonel  阅读(54)  评论(0)    收藏  举报