1041: [HAOI2008]圆上的整点

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4966  Solved: 2258
[Submit][Status][Discuss]

Description

求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

Input

只有一个正整数n,n<=2000 000 000

Output

整点个数

Sample Input

4

Sample Output

4

HINT

Source

思路:看一眼题目,感觉可做。然后开始想思路,想着想着发现不可做,所以就写了个暴力。

这是第一个:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long n;
long long ans;
int main(){
scanf("%lld",&n);
int now=sqrt(n);
long long maxn=n*n;
for(int i=;i<=n;i++){
long long k=i*i;
long long z=maxn-k,s=sqrt(z);
if(s*s!=z) continue;
if(k!=&&s!=) ans+=;
else ans+=;
}
cout<<ans;
}

后来看了一下题解里的视频,想了想,感觉很有道理,就开始了第二次奋斗历程。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long n;
long long ans=,sum;
int p[],c[];
int main(){
scanf("%lld",&n);
int m=n*n;
for(int i=;i<=n;i++)
if(m%i==){
p[++sum]=i;
while(m%i==) m/=i,c[sum]++;
}
if(m>){ p[++sum]=m;c[sum]++; }
for(int i=;i<=sum;i++) cout<<p[i]<<" "<<c[i]<<endl;
for(int i=;i<=sum;i++){
if(p[i]%==) continue;
else if(p[i]%==) ans*=c[i];
else if(p[i]%==&&c[i]%!=) ans=;
}
if(ans==){ printf("0\n");return ; }
else if(ans==){ printf("4\n");return ; }
else cout<<ans*+;
}

结果发现,调试忘记注释了。。。

只有某个奇怪的点得分了。。。

然后我就以为我把调试注释以后,就能AC4个点。然并卵,还是20分。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long n;
long long ans=,sum;
int p[],c[];
int main(){
scanf("%lld",&n);
int m=n*n;
for(long long i=;i<=n;i++)
if(m%i==){
p[++sum]=i;
while(m%i==) m/=i,c[sum]++;
}
if(m>){ p[++sum]=m;c[sum]++; }
// for(int i=1;i<=sum;i++) cout<<p[i]<<" "<<c[i]<<endl;
for(int i=;i<=sum;i++){
if(p[i]%==) continue;
else if(p[i]%==) ans*=c[i];
else if(p[i]%==&&c[i]%!=) ans=;
}
if(ans==){ printf("0\n");return ; }
else if(ans==){ printf("4\n");return ; }
else cout<<ans*+;
}

最后,终于胜利了!!

这是对上一个代码的优化。

首先 先把n的因数中的2都消去,因为2对答案并没有贡献。

其次 一个数 n*n=n^2 可以因式分解n^2=p1a1*2*p2a1*2*p3a3*2*......

所以,因式分解后的质数,如果模4后余1那ans=ans*(ai*2+1);最后ans*4。

还有自身是%4=1的质数的情况特判一下。ans=ans*(1*2+1)=ans*3;

然后输出就好了。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int ans=;
int n,sum=;
int main(){
scanf("%d",&n);
while((n&)^) n>>=;
while(sum*sum<=n) sum++;
for(int i=;i<=sum;i++)
if(n%i==){
int tmp=;
while(n%i==){ n/=i;tmp+=; }
if(i%==) ans=ans*(tmp+);
}
if(n>&&n%==) ans*=;
printf("%d",ans);
}

BZOJ(2) 1041: [HAOI2008]圆上的整点的更多相关文章

  1. 【BZOJ】1041: [HAOI2008]圆上的整点(几何)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=1041 所谓的神题,我不会,直接题解..看了半天看懂题解了.详见hzwer博客 这题呢,我只能 ...

  2. 【BZOJ】 1041: [HAOI2008]圆上的整点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 ${x^{2}+y^{2}=r^{2} }$ ${\Rightarrow y^{2} ...

  3. BZOJ 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

  4. bzoj 1041: [HAOI2008]圆上的整点 数学

    1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  5. bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Stat ...

  6. BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Sta ...

  7. 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4298  Solved: 1944[Submit][Sta ...

  8. BZOJ 1041 [HAOI2008]圆上的整点:数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...

  9. BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...

随机推荐

  1. [C陷阱和缺陷] 第4章 连接

    一个C程序可能是由多个分别编译的部分组成,这些不同部分通过连接器合并成一个整体.在本章中,我们将考查一个典型的连接器,注意它是如何对C程序进行处理的,从而归纳出一些由于连接器的特点而可能导致的错误. ...

  2. 水题 CodeForces 137A Postcards and photos

    题目传送门 /* 水! */ #include <cstdio> #include <cstring> #include <algorithm> using nam ...

  3. 2105. [NOIP2015] 信息传递

    ★☆   输入文件:2015message.in   输出文件:2015message.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 有n个同学(编号为1到n)正在 ...

  4. js中时钟表盘

    1.js时钟表盘 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. spring aop 方法增加日志记录

    使用场景: 1:调用外部接口时需要记录出参和入参. 2:分布式系统之间,调用各个系统之间需要记录日志,一旦出现了问题也可以找得到元数据 一言不合,上代码: # 枚举类 package xxxxxxxx ...

  6. 【maven】Description Resource Path Location Type An error occurred while filtering resources TESTVIDEO line

    在maven中构建项目的时候发现了如下错误: Description Resource Path Location Type An error occurred while filtering res ...

  7. python bs4库

    Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. BeautifulSoup ...

  8. Spring资源访问接口Resource

    该接口拥有对不同资源类型的实现类 boolean exists() 资源是否存在 boolean isOpen() 资源是否打开 URL getURL() 如果底层资源可以表示成URL,则该方法返回对 ...

  9. python多进程和多线程编程

    17 多线程和多进程并发 The modules described in this chapter provide support for concurrent execution of code. ...

  10. cin的返回对象

    //有时间回来补坑 //先记上几个有用的博客 https://blog.csdn.net/candj/article/details/4419585https://www.cnblogs.com/gy ...