8 11 周赛

来源:互联网 发布:java高级编程 pdf 编辑:程序博客网 时间:2024/05/01 21:01

这次比赛一道题也没做,我太没自信了,下次一定要相信自己,横向比较,不怕TLE,不怕WA,有想法就写,大胆利用题目中给出的条件。

A

http://www.bnuoj.com/bnuoj/problem_show.php?pid=33679

说是一道数论的题目,但是利用条件中的任何一个都能暴搞通过。

不过还是可以记住以下结论:

两平方数之和定理:

(a):将m分解为      m=p1*p2*.....pn*M^2;

        其中p1、p2、....pn是互不相同的素因子,则m可表成两个平方数之和的充分必要条件是每个pi或为2或为摸4余1

(b):m能够表示成两个平方数之和m=a*a+b*b 且gcd(a,b)=1; 当且仅当以下两个条件之一成立

        (I)m为奇数且m的每个素因子都摸4余1

        (II)m为偶数,m/2是奇数且m/2的每个素因子都模4余1

 

代码1:利用第一个条件

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<stdlib.h>#include<cmath>using namespace std;int main(){    int t,p,q;    cin>>t;    while(t--)    {        int m,n;        scanf("%d%d",&p,&q);        //cout<<p<<" "<<q<<endl;        int ans=max(abs(p),abs(q));        //cout<<ans<<endl;        int sum=0;        for(m=-ans; m<=ans; m++)        {            for(n=-ans; n<=ans; n++)            {                if(m==0&&n==0)                    continue;                int a=m*m+n*n;                int b=m*p+n*q;                int c=m*q-n*p;                if(b%a==0&&c%a==0)                {                    //cout<<a<<" "<<b<<" "<<c<<endl;                    sum++;                }            }        }        if(sum==8)            printf("P\n");        else            printf("C\n");    }    return 0;}


代码2:利用第二个条件

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<stdlib.h>#include<cmath>using namespace std;int squre[200001];void Squre(){    memset(squre,0,sizeof(squre));    int i,j;    for(i=0; i*i<=20000; i++) //一开始i从0开始WA了,注重细节    {        for(j=i; j*j+i*i<=20000; j++)            squre[i*i+j*j]=1;    }}int main(){    Squre();    int T;    int p,q;    cin>>T;    while(T--)    {        scanf("%d%d",&p,&q);        int flag=0;        int ans=p*p+q*q;        for(int i=2; i*i<=ans; i++)        {            if(ans%i==0)            {                if(squre[i]==1&&squre[ans/i]==1)                {                   // cout<<i<<" "<<ans/i<<endl;                    flag=1;                    break;                }            }        }        if(flag==1)            printf("C\n");        else            printf("P\n");    }    return 0;}


 

H 题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=33684

   并查集的应用

题目大意:给出一部分物品a、b之间的重量差,求c、d之间的重量差,若有已知条件可以求,输出答案,否则输出“NUKNOWN"

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>#include<stdlib.h>using namespace std;int p[100050];int w[100050];int m,n;void init(){    for(int i=1;i<=n;i++)    {        p[i]=i;        w[i]=0;    }}int find(int x){    if(x==p[x])        return x;    else    {        int ff=p[x];        p[x]=find(p[x]);        w[x]+=w[ff];        return p[x];    }}int main(){    char c[5];    int a,b,weight;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0)            return 0;        init();        while(m--)        {            scanf("%s",&c);  //cin10043ms  scanf 843ms            if(c[0]=='!')            {                scanf("%d%d%d",&a,&b,&weight);                int aa=find(a);                int bb=find(b);                if(aa>bb)                {                    p[aa]=bb;                    w[aa]=w[b]-w[a]-weight;                }                else                {                    p[bb]=aa;                    w[bb]=w[a]-w[b]+weight;                }            }            else            {                scanf("%d%d",&a,&b);                if(find(a)==find(b))                {                    printf("%d\n",w[b]-w[a]);                }                else                    printf("UNKNOWN\n");            }        }    }}


 

 

 

原创粉丝点击