BZOJ(2) 1041: [HAOI2008]圆上的整点
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
Sample Output
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]圆上的整点的更多相关文章
- 【BZOJ】1041: [HAOI2008]圆上的整点(几何)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1041 所谓的神题,我不会,直接题解..看了半天看懂题解了.详见hzwer博客 这题呢,我只能 ...
- 【BZOJ】 1041: [HAOI2008]圆上的整点
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 ${x^{2}+y^{2}=r^{2} }$ ${\Rightarrow y^{2} ...
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
- bzoj 1041: [HAOI2008]圆上的整点 数学
1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 853[Submit][Stat ...
- BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4210 Solved: 1908[Submit][Sta ...
- 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4298 Solved: 1944[Submit][Sta ...
- BZOJ 1041 [HAOI2008]圆上的整点:数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...
- BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...
随机推荐
- 二分搜索poj106
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 49944 Accepted: 10493 De ...
- vue中数据接收成功,页面渲染失败
1.vue中数据接收成功,页面渲染失败.代码如下 经过查找资料修改代码为 或是 原因是: 由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如: ...
- [转]从数据到代码——基于T4的代码生成方式
本文转自:http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html 在之前写一篇文章<从数据到代码>(上篇.下篇)中,我通 ...
- 第八届蓝桥杯省赛C/C++ A组第8题 包子凑数
参考了http://blog.csdn.net/y1196645376/article/details/69718192 思路: 数论+完全背包. 实现: #include <iostream& ...
- vue-devtools是vue浏览器调试工具
开vue官网在vue-生态系统-工具可以看到vue-devtools这个工具: vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们的调试效率.接下来我 ...
- C# datagrideview插件的使用
private void btnLogin_Click(object sender, EventArgs e) { string txtUserName = this.txtUserName.Text ...
- VC++函数只被调用一次
如何保证某个函数只被调用一次 一个函数caller会在其内部调用另外一个函数callee,现在的情况是,caller可能会在多个地方被多次调用,而你希望callee只在第一次被调用时被调用一次.一 ...
- STA之Concepts (1)
Static Timing Analysis is one of the many techniques available to verify the timing of a digital des ...
- 你的宽带ip地址被100.64了吗?
你的宽带ip地址被100.64了吗? 最近需要用外网的时候发现,宿舍路由wan口的ip变成了100.64.X.X,本以为是一个外网的ip,可事实上并不是,并且从外网无法直接访问. 首先,我们都 ...
- 【linux】 下根目录,家目录区别,以及普通用户到root用户的切换
一:家目录 一般普通用户,家目录是/home/用户名 root用户,家目录是/root root登录系统,执行如下命令进入root的家目录 cd /cd ~ 进入家目录后执行如下命令获取具体路径 pw ...