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. 数学/思维 UVA 11300 Spreading the Wealth

    题目传送门 /* 假设x1为1号给n号的金币数(逆时针),下面类似 a[1] - x1 + x2 = m(平均数) 得x2 = x1 + m - a[1] = x1 - c1; //规定c1 = a[ ...

  2. 关于dbms_output包的使用

    General Source {ORACLE_HOME}/rdbms/admin/dbmsotpt.sql First Available 7.3.4 Data Types TYPE chararr ...

  3. SQL Split函数,将一串字符串返回成table

    写法一: CREATE FUNCTION [dbo].[Split] ( @str VARCHAR(MAX), --传进来的字符串 ) --分割符 ) RETURNS @t TABLE --定义一个虚 ...

  4. NodeJs学习记录(四)初学阶段关于app.js里的一些重要配置

    app.set('views', path.join(__dirname, 'views')); 以上代码用于配置页面文件(例如 .ejs 文件)的根目录, 设置之后 访问 ./index 则等同于访 ...

  5. 本地编译全志R系列的步骤(Ubuntu16.04.4版本)

    本地编译全志R系列的步骤(Ubuntu16.04.4版本) 2018/6/14 9:32 版本:V1.0 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的And ...

  6. JSP学习笔记 - 内置对象 Response

    1.response.addHeader("refresh","2"): 制定页面刷新时间 2.response.addHeader("refresh ...

  7. daxcie

    Database->Edit Current DBMS菜单 修改如下:选中General选项卡,依次打开Script->Sql->Fomat->CaseSensitivityU ...

  8. ERwin 正向工程

    1.物理模型带字段备注 COMMENT ON 将模型切换至 physical 模式选择 Model ---> Domain Dictionary , 在 tab 标签中,切换至comment 然 ...

  9. eclipse配置Tomcat服务器server locations的方法

    最近放弃了使用Myeclipse,转而使用eclipse作为开发工具,确实Myeclipse集成了太多东西,使得开发人员的配置越来越少,这不是个好事,使用eclipse后,有些地方就得自己去配置,比如 ...

  10. PHP封装数据库

    (1)按照步骤封装数据库 ①引入抽象类和抽象方法,即引入模板: ②继承抽象类,注意参数(规定几个就传入几个): ③逐个写入抽象方法,必须一一对应:(抽象方法必须一一引入,否则会报错-->有个抽象 ...