[HAOI2008]圆上的整点

本文同步在ZCDHJ的个人博客发布戳这里看文章


传送门

BZOJ
洛谷

Solution

这个东西不是直接复数一顿乱搞就好了嘛?
考虑以下的过程:
\(a^2+b^2=c^2\)
这个东西的形式不是很像共轭吗?
一个复数的贡献是什么不是也很容易算吗?
把所有的东西抽象到平面坐标直角系上,你就发现共轭对匹配相当于是旋转90°的倍数.
然后单独把贡献加起来就好了.
因为是平方,所以不存在不可能分解的情况.
OI中出现这种神仙题目还是很难的,所以看一下就差不多了.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<iostream>
#include<map>
#define ll long long
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline ll gi(){
	ll sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
int main(){
	ll r=gi(),ans=1;
	ll all=r*r,zs=2;
	while(all!=1 && zs<=r){
		ll cnt=0;
		while(all%zs==0){all/=zs;cnt++;}
		if(cnt){
			if(zs%4==3)
				if(cnt%2)return puts("0"),0;
				else ;
			else if(zs!=2)ans=ans*(cnt+1);
		}
		zs++;
	}
	if(all!=1){
		if(all%4==3)return puts("0"),0;
		else ans=ans*2;
	}
	printf("%lld\n",ans*4);
	return 0;
}
posted @ 2019-01-02 17:10  cjgjh  阅读(148)  评论(0编辑  收藏  举报