[关闭]
@MLEAutoMaton 2019-04-19T09:34:08.000000Z 字数 989 阅读 594

[HAOI2008]圆上的整点

数学 BZOJ


传送门

BZOJ

Solution

神仙题,本题的思路来源于视频看了之后不会被教练抓...

设某一个数.

可以分解为一对形如(),()的共轭数对,那么称为高斯整数

那么显然对于某一个点保证.emmm,意味着这个点是一个符合答案的点.

考虑把分解一下,分解成两个复数的乘,那么两边显然是他的约数,相当于点?

所以分解质因数然后组合就可以了.

这样就没有了.

吗?

如果是一个不能够分解成两个共轭数对的数怎么办呢?的质数.

如果出现次数为偶数就平均分,否则就是0.

这下就没了.

代码实现

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<iostream>
  6. #include<queue>
  7. #include<algorithm>
  8. #include<map>
  9. #include<set>
  10. using namespace std;
  11. #define ll long long
  12. #define re register
  13. #define file(a) freopen(a".in",,"r",stdin);freopen(a".out","w",stdout)
  14. inline int gi()
  15. {
  16. int f=1,sum=0;char ch=getchar();
  17. while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
  19. return f*sum;
  20. }
  21. int n;
  22. int main()
  23. {
  24. n=gi();ll ans=1;
  25. if(n==0)return puts("1"),0;
  26. for(int i=2;i*i<=n;i++)
  27. if(n%i==0)
  28. {
  29. int ps=0;
  30. while(n%i==0)n/=i,ps++;
  31. if(i%4==1)ans=1ll*ans*(2*ps+1);
  32. }
  33. if(n>1)if(n%4==1)ans=ans*3ll;
  34. printf("%lld\n",1ll*ans*4);
  35. return 0;
  36. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注