Codeforces Round #195 (Div. 2) 解题报告

problem A. Vasily the Bear and Triangle

题目:http://codeforces.com/problemset/problem/336/A

思路:水题,,虽然没大看懂什么意思,但随便写了写就过了。。。。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int x,y;
10     scanf("%d%d",&x,&y);
11     int ax,ay;
12     ax=x;
13     if(x<0)
14         ax=-x;
15     ay=y;
16     if(y<0)
17         ay=-y;
18     int s=ax+ay;
19     if(x<0)
20     {
21         if(y<0)
22             printf("%d 0 0 %d\n",-s,-s);
23         else
24         {
25             printf("%d 0 0 %d\n",-s,s);
26         }
27     }
28     else
29     {
30         if(y<0)
31             printf("0 %d %d 0\n",-s,s);
32         else
33         {
34             printf("0 %d %d 0\n",s,s);
35         }
36     }
37     return 0;
38 }
View Code

 

problem B. Vasily the Bear and Fly

题目:http://codeforces.com/problemset/problem/336/B

思路:从1~m号圆圆心分别到m+1~2m号圆圆心的最短距离的平均值

 

        计算竖列相差i个圆  计算次数   每次距离

        i=0                        m          2R

        i=1                       2m-2      2R+sqrt(2)*R

        i>=2                     2m-2i      2*i-2+sqrt(8)*R

        次数乘距离相加除以m*m即可

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int main()
 7 {
 8     int m,r;
 9     scanf("%d%d",&m,&r);
10     double dm=m;
11     double dr=r;
12     double sum;
13     int i;
14     double p=sqrt(2.0)*dr;
15     double pp=sqrt(8.0)*dr;
16     sum=dm*2*dr;
17     for(i=1; i<m; i++)
18     {
19         int u=2*i;
20         if(i<2)
21         sum+=(2*dm-u)*(u*dr+p);
22         else
23         sum+=(2*dm-u)*((u-2)*dr+pp);
24     }
25     sum/=(dm*dm);
26     printf("%.10f\n",sum);
27 
28     return 0;
29 }
View Code

 

problem C. Vasily the Bear and Sequence

题目:http://codeforces.com/contest/336/problem/C

思路:从大到小枚举v,若data[j]&1<<i!=0,,,则证明满足条件  否则不行,,,得到的sum若能整除1<<i,,,则找到。。。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=100010;
 6 int data[maxn];
 7 int main()
 8 {
 9     int n;
10     while(scanf("%d",&n)!=EOF)
11     {
12         int i,j;
13         for(i=1; i<=n; i++)
14         {
15             scanf("%d",&data[i]);
16         }
17         int sum;
18         int num;
19         for(i=29; i>=0; i--)
20         {
21             int m=1<<i;
22             sum=-1;
23             num=0;
24             for(j=1; j<=n; j++)
25             {
26                 if((data[j]&m)!=0)
27                 {
28                     if(sum==-1)
29                         sum=data[j];
30                     else
31                         sum&=data[j];
32                     num++;
33                 }
34             }
35             int k=0;
36             if(sum%m==0)
37             {
38                 printf("%d\n",num);
39                 for(i=1;i<=n;i++)
40                 {
41                     if((data[i]&m)!=0)
42                     {
43                         k++;
44                         if(k!=num)
45                         printf("%d ",data[i]);
46                         else
47                         printf("%d\n",data[i]);
48                     }
49 
50                 }
51                 break;
52             }
53         }
54     }
55     return 0;
56 }
View Code

 

problem D. Vasily the Bear and Beautiful Strings

题目:http://codeforces.com/contest/336/problem/D

思路:g值=string

         0  =1__(指第一位只要为1,后面随便排列最后即可得到g值为0,(下同))

         1  =01__ 

    0  =001__

         1   =0001__

         ......=........

         即可发现规律,,,,注意1的个数只有1的时候需要特判

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 using namespace std;
  6 #define LL __int64
  7 const int maxn=100010;
  8 const int mod=1000000007;
  9 int n0,n1,g;
 10 LL fac[maxn*2];
 11 void init()//处理i的阶乘
 12 {
 13     int i;
 14     fac[1]=1;
 15     for(i=2; i<=maxn*2-5; i++)
 16     {
 17         fac[i]=i*fac[i-1];
 18         fac[i]%=mod;
 19     }
 20 }
 21 //求p^n
 22 LL poow(LL p,LL n)
 23 {
 24     LL sp=1;
 25     while(n>0)
 26     {
 27         if(n%2==1)
 28             sp=sp*p%mod;
 29         n/=2;
 30         p=p*p%mod;
 31     }
 32     return sp;
 33 }
 34 //在a与mod互质的情况,根据费马小定理,求a的逆元
 35 LL inv(LL a)
 36 {
 37     return poow(a,mod-2);
 38 }
 39 //求组合数
 40 LL c(int n,int k)
 41 {
 42     LL res;
 43     if(n==k)
 44         return 1;
 45     if(k==0)
 46         return 1;
 47     res=fac[n]*inv(fac[n-k]*fac[k]%mod);
 48     res%=mod;
 49     return res;
 50 }
 51 int main()
 52 {
 53     init();
 54     while(scanf("%d%d%d",&n0,&n1,&g)!=EOF)
 55     {
 56         int num1,num0;
 57         int i;
 58         LL ans=0;
 59         if(n0==0)
 60         {
 61             if(n1==1)
 62             {
 63                 if(g==0)
 64                     printf("0\n");
 65                 else
 66                     printf("1\n");
 67             }
 68             else
 69             {
 70                 if(g==0)
 71                     printf("1\n");
 72                 else
 73                     printf("0\n");
 74             }
 75             continue;
 76         }
 77         if(n1==0)
 78         {
 79             if(n0%2==1)
 80             {
 81                 if(g==0)
 82                     printf("1\n");
 83                 else
 84                     printf("0\n");
 85             }
 86             else
 87             {
 88                 if(g==0)
 89                     printf("0\n");
 90                 else
 91                     printf("1\n");
 92             }
 93             continue;
 94         }
 95         if(g==0)
 96         {
 97             for(i=0; i<=n0; i+=2)//偶数个0加上1个1时候,后面随便排列
 98             {
 99                 num1=1;
100                 num0=i;
101                 if(n0+n1-(num0+num1)>0)
102                 {
103                     ans+=c(n0+n1-(num0+num1),n0-num0);
104                 }
105                 ans%=mod;
106 
107             }
108             if(n1==1)//特判1的个数为1的时候
109             {
110                 if(n0%2==1)//当0的个数为奇数是才会最终成为0
111                     ans++;
112             }
113         }
114         else
115         {
116             for(i=1; i<=n0; i+=2)//奇数个0加上1个1时候,后面随便排列
117             {
118                 num1=1;
119                 num0=i;
120                 if(n0+n1-(num0+num1)>0)
121                 {
122                     ans+=c(n0+n1-(num0+num1),n0-num0);
123                 }
124                 ans%=mod;
125 
126             }
127             if(n1==1)//特判1的个数为1的时候
128             {
129                 if(n0%2==0)//当0的个数为偶数是才会最终成为1
130                     ans++;
131             }
132         }
133         printf("%I64d\n",ans);
134     }
135     return 0;
136 }
View Code

 

posted @ 2013-08-10 21:37  琳&leen  阅读(438)  评论(0编辑  收藏  举报