这次比赛一道题也没做,我太没自信了,下次一定要相信自己,横向比较,不怕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");
}
}
}
}