• 2020.4.11 组队rating赛 解题+补题报告


    D. A Simple Math Problem

     1.题意

      给定正整数a,b,求x,y满足x+y=a,lcm(x,y)=b。

     2.题解

      设c=gcd(x,y),那么x=i*c,y=j*c。因为c是x,y的最大公约数,所以i,j互质。

      所以a=x+y=(i*c)+(j*c)=(i+j)*c,b=lcm(x,y)=x*y/gcd(x,y)=x*y/c=(i*c*j*c)/c=i*j*c

      由于i,j互质,所以i+j和i*j也互质,因此gcd(a,b)=c=gcd(x,y)

      因为x+y=a  x*y=b*gcd(x,y)=b*gcd(a,b),解二元一次方程得:x=(a+sqrt(a*a-4*b*gcd(a,b)))/2

      (参考题解:https://blog.csdn.net/Ivan_zcy/article/details/83213026)

     3.代码

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 ll gcd(ll a,ll b){
     5     return b==0?a:gcd(b,a%b);
     6 int main () {
     7     ll a, b;
     8     while(~scanf("%lld%lld",&a,&b)){
     9         ll c=gcd(a,b);    //c=gcd(x,y)=gcd(a,b)
    10         double x=(sqrt(a*a-4*b*c)+a)/2;
    11         if(x==(ll)x){
    12             ll ans=(ll)x;
    13             cout<<min(ans,a-ans)<<' '<<max(ans,a-ans)<<endl;
    14         } 
    15         else 
    16             cout<<"No Solution"<<endl;
    17     }
    18     
    19     return 0;
    20 }

     H. To begin or not to begin

     1.题意

      一个盒子里有红色和黑色两种共n个球,只有一个红球,其余为k个黑球,两个人轮流从盒子里取球,先取出红球者获胜。如果第一个取球的人有优势输出1,劣势输出2,均势则输出0。

     2.题解

      设第一个人获胜概率为A,第二个人获胜概率为B。当k=1时,A=B=1/2,输出0;当k=2时,A=1/3+2/3*1/2=2/3,B=2/3*1/2=1/3,输出1;当k=3时,A=1/4+3/4*2/3*1/2=1/2,B=3/4*1/3+3/4*2/3*1/2=1/2······推得结论为:当k为奇数时,输出0,否则输出1。

     3.代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int k;
     4 int main(){
     5     ios::sync_with_stdio(false);
     6     while(~scanf("%d",&k)){
     7         if(k%2)
     8             cout<<0<<endl;
     9         else
    10             cout<<1<<endl;
    11     }
    12     
    13     return 0;
    14 }

    I. Convex

     1.题意

      给定n个点和点到n边形中心的距离,求n边形面积。

     2.题解

      将每个三角形面积相加即为n边形的面积。

     3.代码

     1 #include<bits/stdc++.h>
     2 #define PI 3.1415926
     3 using namespace std;
     4 int n,d;
     5 int main(){
     6     while(~scanf("%d%d",&n,&d)){
     7         int x;
     8         double ans=0.0;
     9         for(int i=1;i<=n;i++){
    10             cin>>x;
    11             ans+=d*d*sin(PI*x/180)/2;
    12         }
    13         printf("%.3f
    ",ans);
    14     }
    15     
    16     return 0;
    17 }

    J. Find Small A

     1.题意

      给定n个数,每个数都可以拆开成一个32位的二进制,每八位一个字节 ,问每个字节的二进制数换算成十进制有多少个97。

     2.题解

       数字a%256就是取后八位,每八位判断一次。

      (参考题解:https://blog.csdn.net/zzcblogs/article/details/71079356)

     3.代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,ans;
     4 int main() {    
     5     cin>>n;
     6     for(int i=1;i<=n;i++){
     7         int x;
     8         cin>>x;
     9         while(x){
    10             if((x%256)==97)
    11                 ans++;
    12             x/=256;
    13         }
    14     }
    15     cout<<ans<<endl;
    16     
    17     return 0;
    18 }

     

  • 相关阅读:
    python函数对象
    生成器表达式,列表推导式
    python转换excel成py文件
    Python处理excel表
    Go基础:接口相关
    JAVA03-输入和输出
    python6-while循环
    python5-字典
    自动化8-xpath
    网络学习day1-计算机网络基础
  • 原文地址:https://www.cnblogs.com/lvguapi/p/12684299.html
Copyright © 2020-2023  润新知