您的位置:首页 > 其它

Single Round Match 477 Round 1 - Division I, Level Two PythTriplets

2014-11-11 22:53 375 查看
考虑a,b的奇偶性。

若a,b同时是偶数,gcd(a,b)!=1;

若a,b同时是奇数,(2*k1+1)^2+(2*k2+1)^2=4(k1^2+k2^2+k1+k2)+2,等式右边是一个偶数,那么必然为一个偶数的平方,但是一个偶数的平方必然能被4整除。

故a,b必然一奇一偶,构造二分图求最大匹配即可。

#include <bits/stdc++.h>
#define maxn 3009
using namespace std;
int cx[maxn],cy[maxn],vis[maxn],lable,n;
char s[1000009];
vector<int>G[maxn];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int dfs(int u)
{
for(int i=0;i<(int)G[u].size();i++)
{
int v=G[u][i];
if(vis[v]!=lable)
{
vis[v]=lable;
if(cy[v]==-1||dfs(cy[v]))
{
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int match()
{
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
memset(vis,0,sizeof(vis));
lable=0;
int res=0;
for(int i=0;i<n;i++)
{
if(cx[i]==-1)
{
lable++;
res+=dfs(i);
}
}
return res;
}
class PythTriplets
{
public:int findMax(vector <string> stick)
{
vector<int>a,X,Y;
string S="";
for(int i=0;i<(int)stick.size();i++)
{
S+=stick[i];
}
for(int i=0;i<(int)S.length();i++)
s[i]=S[i];
char *p=strtok(s," ");
a.push_back(atoi(p));
while(p)
{
a.push_back(atoi(p));
p=strtok(NULL," ");
}
for(int i=0;i<(int)a.size();i++)
{
if(a[i]%2==1)
X.push_back(a[i]);
else
Y.push_back(a[i]);
}
for(int i=0;i<(int)X.size();i++)
{
for(int j=0;j<(int)Y.size();j++)
{
if(gcd(X[i],Y[j])!=1)
continue;
long long x=X[i],y=Y[j];
long long z=round(sqrt(x*x+y*y));
if(z*z!=x*x+y*y)
continue;
G[i].push_back(j);
}
}
n=X.size();
return match();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: