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. DFS(连通块) HDU 1241 Oil Deposits

    题目传送门 /* DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 */ /************************************************ ...

  2. Linux环境下修改MySQL数据库存储引擎

    今天在执行Oracle数据库迁移至MySQL数据库时报出了一个错误信息: Specified key was too bytes 百度发现,原来需要更改MySQL数据库的存储引擎为InnoDB,查询目 ...

  3. CDH搭建Hadoop分布式服务器集群(java新手小白)

    1首先对于一个java还白的小白,先理解CDH与Hadoop的关系 一.Hadoop版本选择. Hadoop大致可分为Apache Hadoop和第三方发行第三方发行版Hadoop,考虑到Hadoop ...

  4. 改变默认选择前1000行,编辑前200行【MSSQL】

  5. Hadoop的数据采集框架

    问题导读: Hadoop数据采集框架都有哪些? Hadoop数据采集框架异同及适用场景? Hadoop提供了一个高度容错的分布式存储系统,帮助我们实现集中式的数据分析和数据共享.在日常应用中我们比如要 ...

  6. Java编程思想读书笔记_第三章

    本章提到的关于==的部分,一个完整的实验如下: class Test { public static void main(String[] args) { Integer i = new Intege ...

  7. python--12、pymysql模块

    安装 pip3 install pymysql 使用方法(示例表为用户注册信息表): import pymysql user=input('username: ').strip() pwd=input ...

  8. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  9. 好用的sublime插件以及快捷键

    管理插件:使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 import urllib.request,os,hashlib; h = '2915 ...

  10. node 实现Token状态登录 及数据库增删改查

    1.项目目录结构 2.启动入口文件代码index.js const express = require('express') const bodyParser = require('body-pars ...