ZOJ3673:1729
1729 is the natural number following 1728 and preceding 1730. It is also known as the Hardy-Ramanujan number after a famous anecdote of the British mathematician G. H. Hardy regarding
a hospital visit to the Indian mathematician Srinivasa Ramanujan. In Hardy's words:
I remember once going to see him when he was ill at Putney. I had ridden in taxi cab number 1729 and remarked that the number seemed to me rather a dull one, and that I hoped it was not an unfavorable omen. "No," he replied, "it is a very interesting
number; it is the smallest number expressible as the sum of two (positive) cubes in two different ways."
The two different ways are these: 1729 = 13 + 123 = 93 + 103
Now your task is to count how many ways a positive number can be expressible as the sum of two positive cubes in. All the numbers in this task can be expressible as the sum of two positive cubes in at least one way.
Input
There're nearly 20,000 cases. Each case is a positive integer in a single line. And all these numbers are greater than 1 and less than 264.
Output
Please refer to the sample output. For each case, you should output a line. First the number of ways n. Then followed by n pairs of integer, (ai,bi),
indicating a way the given number can be expressible as the sum of ai's cube and bi's. (ai≤ bi, and a1< a2<
...< an)
Sample Input
9
4104
2622104000
21131226514944
48988659276962496
Sample Output
1 (1,2)
2 (2,16) (9,15)
3 (600,1340) (678,1322) (1020,1160)
4 (1539,27645) (8664,27360) (11772,26916) (17176,25232)
5 (38787,365757) (107839,362753) (205292,342952) (221424,336588) (231518,331954)
Hint
Although most numbers cannot be expressible as the sum of two positive cubes, the vast majority of numbers in this task can be expressible as the sum of two positive cubes in two or more ways.
题意比較简单,就不解释了
这题还真是弄了好久,再加上犯的各种小错误,可是最终算是搞出来了,不easy啊。。。
思路:要求满足的m=a3+b3=(a+b)(a2-ab+b2)的(a,b)组合。
令t=a+b,则t一定是m的约数,所以应枚举m的全部约数。
然后能够得到
a+b=t
ab=(t2-m/t)/3=p
继而转化为a2-ta+p=0是否有正整数解就能够了。
再就是注意范围要用unsigned long long。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define ll unsigned long long
#define maxn 2642246//2^64次方的开立方
#define L 5000001
ll n;
ll prime[L],divi[500],e[500];
int len,len_prime,len_s;
bool flag[L] = {false};
struct node
{
ll x,y;
} s[1005]; int cmp(node x,node y)
{
return x.x<y.x;
} void init()//素数且不说,全部合数都能分解成随意素数之积
{
int i,j;
len_prime = 0;
for(i = 2; i<L; i++)
{
if(!flag[i]) prime[len_prime++] = i;//打下素数表
for(int j = 0; j<len_prime && i*prime[j]<L; j++)
{
flag[i*prime[j]] = true;//全部非素数排除
if(i%prime[j]==0) break;
}
}
} void find_div(ll m)//找出m的全部素因子
{
int i;
ll k;
len = 0;
for(i = 0; i<len_prime && prime[i]*prime[i]<=m; i++)
{
if(m%prime[i] == 0)
{
divi[len] = prime[i];//因子保存
k = 1;
m/=prime[i];
while(m%prime[i] == 0)//除尽为止
{
k++;//记录个数
m/=prime[i];
}
e[len++] = k;
}
}
if(m>1)
{
divi[len] = m;
e[len++] = 1;
}
} ll can_sqrt(ll c)//要求整数解,b^2-4*a*c必须能开出整数
{
ll r = sqrt(1.0*c);
if(r*r == c) return r;
return L;
} int judge(ll x,ll y)//看这组解是否已经存在
{
for(int i=0; i<len_s; i++)
if(s[i].x==x&&s[i].y==y)
return 1;
return 0;
} void solve(ll t)//找出解
{
ll x1,x2;
ll k = n/t;
ll r = t*t-k;
if(r>0 && r%3!=0) return ;
r/=3;
ll dis = t*t-4*r;
if(dis<0) return ;
ll c = can_sqrt(dis);
if(c == L) return;
if((t+c)%2 == 0)
{
x1 = (t+c)/2;
x2 = t-x1;
if(x1>x2) swap(x1,x2);
if(x1>0&&x1<t&&x1<maxn&&x2<maxn&&x2>0&&x2<t&&!judge(x1,x2))
{
s[len_s].x=x1;
s[len_s++].y=x2;
}
}
if((t-c)>0 && (t-c)%2 == 0)
{
x1 = (t-c)/2;
x2 = t-x1;
if(x1>x2) swap(x1,x2);
if(x1>0&&x1<t&&x1<maxn&&x2<maxn&&x2>0&&x2<t&&!judge(x1,x2))
{
s[len_s].x=x1;
s[len_s++].y=x2;
}
}
} ll ppow(ll a,ll b)
{
ll ans = 1;
while(b)
{
if(b&1) ans*=a;
b>>=1;
a*=a;
}
return ans;
} void dfs(int m,ll sum)
{
solve(sum);
if(m>=len) return ;
for(int i = 0; i<=e[m]; i++)//由个数去枚举次方,1为a,2为a^2,3为a^3,如此类推,枚举全部t
dfs(m+1,sum*ppow(divi[m],i));
} int main()
{
init();
while(~scanf("%llu",&n))
{
find_div(n);
len_s = 0;
dfs(0,1);
sort(s,s+len_s,cmp);
printf("%d",len_s);
for(int i = 0; i<len_s; i++)
printf(" (%llu,%llu)",s[i].x,s[i].y);
printf("\n");
} return 0;
}
ZOJ3673:1729的更多相关文章
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- zoj 3673 1729
1729 Time Limit: 3 Seconds Memory Limit: 65536 KB 1729 is the natural number following 1728 and ...
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...
- hdoj 1729 Stone Games(SG函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写 看了题解,最后才明白该怎么去理 ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1347 Solved: 724[Submit][Stat ...
随机推荐
- js函数前加分号和感叹号的作用
js函数前加分号和感叹号是什么意思?有什么用? 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascrip ...
- Oracle 函数 “数据控制,指定某些人只能查看他权限范围内的信息”
create or replace function work_plan_mask (p_schema VARCHAR2,p_table VARCHAR2) return Varchar2 AS -- ...
- 网络路径查询traceroute
Traceroute用法 网友:适兕 发布于: 2006.08.24 08:14 (共有条评论) 查看评论 | 我要评论 一.什么是Traceroute? In ...
- python基础学习之路No.2 数据类型
python中常见的数据类型有:整数.浮点数.字符串.列表.元组.字典 python相较其他语言,可以省略了声明,可以直接定义赋值使用. 例如: a=12 就相当于 其他语言中的 int a=12 ...
- oralce 笔记
查某一表的行数 select max(rownum) from tablename 插入数据之前判断是否重复 insert into tablename (coloum1,coloum2) selec ...
- hdu 4788 (2013成都现场赛 H题)
100MB=10^5KB=10^8B 100MB=100*2^10KB=100*2^20B Sample Input2100[MB]1[B] Sample OutputCase #1: 4.63%Ca ...
- 微信小程序-视频教程-百度云-下载
链接: https://pan.baidu.com/s/16WGL3whutozx-UXqsDPhhA 提取码: 关注公众号[GitHubCN]回复获取 什么是微信小程序?小程序是一种不需要下载安 ...
- Storm(二)CentOS7.5搭建Storm1.2.2集群
一.Storm的下载 官网下载地址:http://storm.apache.org/downloads.html 这里下载最新的版本storm1.2.2,进入之后选择一个镜像下载 二.Storm伪分布 ...
- 【LOJ】#2574. 「TJOI2018」智力竞赛
题解 二分答案 求最小路径点覆盖 由于这里最小路径点覆盖,点是可重的,用floyd求出传递闭包(也就是求出,哪两点之间是可达的) 最后用这个floyd求出的数组建出一个新图,在这个图上跑普通的最小路径 ...
- ubuntu16.04 更换源
1.备份 sudo cp /etc/apt/source.list /etc/apt/source.list.bak 2.打开/etc/apt/source.list,并删除所有内容 sudo ged ...