@description@

令 p[] 为质数序列:p[0] = 2, p[1] = 3, p[2] = 5,以此类推。

令 D 为正整数常数。对于每一个 i >= 0,令 q[i] = q[i] * q[i + D]。

考虑等式 V + W + X + Y = Z。

现给定 N 与 D。统计上面等式的解的数量,同时要求 V <= W <= X <= Y 且所有量 V, W, X, Y, Z 都属于集合 Q = {q[0], q[1], ..., q[N-1]}。

Constraints

1 <= N <= 2500,0 <= D <= 2500。

Examples

0)

15

1

Returns: 2

两个解如下:

6 + 15 + 323 + 323 = 667

6 + 143 + 221 + 1147 = 1517

2470

0

Returns: 0

不存在任何解。

@solution@

假如等式是这样的:W + X + Y = Z。

我们可以变为 W + X = Z - Y,然后 meet in the middle 即可。

那么 5 个变量怎么办呢?注意还有一个条件:p 是质数。

质数有一个什么性质呢?比较复杂的性质当然不是我们分析的目标。我们只考虑质数的奇偶性。

奇偶分析一波,可以发现 5 个变量不可能同时为奇数。然而质数中只有 2 为偶数,所以相当于一定存在一个 2。

而又因为 2 是最小的那个质数,所以得到 V = 2*p[D]。

然后就可以愉快地 meet in the middle 了。

@accepted code@

#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
class Diophantine{
#define MAXN 2500
#define PRIME 60000
#define HASHSIZE 1000037
typedef long long ll;
typedef pair<ll, int> pii;
#define fi first
#define se second
private:
int prm[PRIME + 5], nprm[PRIME + 5], pcnt;
void sieve() {
for(int i=2;i<=PRIME;i++) {
if( !nprm[i] ) prm[pcnt++] = i;
for(int j=0;i*prm[j]<=PRIME;j++) {
nprm[i*prm[j]] = true;
if( i % prm[j] == 0 ) break;
}
}
}
vector<pii>hsh[HASHSIZE];
void hash_insert(ll x) {
int y = x % HASHSIZE;
for(int i=0;i<hsh[y].size();i++)
if( hsh[y][i].fi == x ) {
hsh[y][i].se++;
return ;
}
hsh[y].push_back(make_pair(x, 1));
}
int hash_search(ll x) {
int y = x % HASHSIZE;
for(int i=0;i<hsh[y].size();i++)
if( hsh[y][i].fi == x )
return hsh[y][i].se;
return 0;
}
public:
ll q[MAXN + 5];
int countSolutions(int N, int D) {
sieve();
for(int i=0;i<N;i++)
q[i] = prm[i] * prm[i + D];
int ans = 0;
for(int i=N-1;i>=0;i--) {
for(int j=i+1;j<N;j++)
if( q[j] - q[i] - q[0] > 0 )
hash_insert(q[j] - q[i] - q[0]);
for(int j=i;j>=0;j--)
ans += hash_search(q[i] + q[j]);
}
return ans;
}
};

@details@

一开始看错题了,还以为只有 4 个变量,然后就以为是 meet in the middle 的题。

结果发现是 5 个变量,然后修正一下想法就过了。

这算是。。。因祸得福吗。。。

@topcoder - TCO19 Regional Wildcard Wildcard Round - D1L2@ Diophantine的更多相关文章

  1. Makefile关键字

    @ makefile会把将要执行的命令行在命令执行前输出到屏幕上,使用@可以避免显示出命令本身 若@ echo 正在编译-则$make显示正在编译- 若echo 正在编译-则$make显示: echo ...

  2. beego路由实现原理

    树形结构+递归算法实现路由的注册与匹配: 1 数据结构: // 树节点结构type Tree struct { //search fix route first fixrouters map[stri ...

  3. (转)How to build an Apple Push Notification provider server (tutorial)

    转自:https://blog.serverdensity.com/how-to-build-an-apple-push-notification-provider-server-tutorial/ ...

  4. Linux 通过HTTP进行域名更新

    一.3322动态域名更新接口 接口地址 API URL http://members.3322.net/dyndns/update HTTP请求 GET /dyndns/update?hostname ...

  5. [Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等

    1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...

  6. 转-Windows路由表配置:双网卡路由分流

    原文链接:http://www.cnblogs.com/lightnear/archive/2013/02/03/2890835.html 一.windows 路由表解释 route print -4 ...

  7. Docker+Jenkins持续集成环境(5): android构建与apk发布

    项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...

  8. [Python] wxPython 高防Windows10记事本 (end...)

    1.开始 接触Python 也有一段时间了,o.o ,断断续续加起来没几天. 一般新学习一门新语言,除了必先输出一个 Hello World 外,都会以模拟 Windows 记事本来写一个结合自己想法 ...

  9. Linux 下 make 命令 及 make 笔记

    Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make ...

随机推荐

  1. JQuery--计算元素的宽度

    /*width:只能计算元素的内容宽度 * innerWidth():可以获取元素的 内容+padding 的宽度 * outerWidth():可以获取元素的 内容+padding+border 的 ...

  2. 面试Mysql的几个常见问题

    1.insert时如果数据重复如何用update? ,,) ; 2.一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启, ...

  3. 【大数据】Hadoop常用启动命令

    Hadoop常用启停命令 最近在装大数据环境,不知由于年纪大的问题还是笨的缘故,老师记不住一些常用命令,在这里就单独记一下Hadoop常用的启停命令.Hadoop常用的启停命令都在hadoop/sbi ...

  4. .net4.6版本前设置window子窗口位置主窗口闪烁

    在安装了.net4.6的版本是不会出现该问题的,但是在4.6以下的版本会出现,当设置之窗体的left和top属性时,会让主窗体闪烁一下. 之前是在load事件下写的: child_window.loa ...

  5. Eclipse-搭建springboot项目报错

    Eclipse Maven pom报错: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Ma ...

  6. VUE.之安装 font-awesome

    VUE.之安装 font-awesome 我们在项目中经常使用各种图标:font-awesome (http://fontawesome.dashgame.com/) 1.npm 安装font-awe ...

  7. http响应头信息

    HTTP 响应头信息 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息. 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST ...

  8. git出现“The file will have its original line endings in your working directory”错误

    一.现象: git add *时出现如下现象: The file will have its original line endings in your working directory 解决: G ...

  9. bzoj4974: [Lydsy八月月赛]字符串大师

    传送门 题目可转换为已知一个串kmp之后的nxt数组,求字典序最小的原串. 已知第i位结尾的串循环节长度位x,那么nxt[i]=i-x; 当nxt不为0时,s[i]=s[nxt[i]]; nxt为0时 ...

  10. poj 2001 Shortest Prefixes(字典树trie 动态分配内存)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15610   Accepted: 673 ...