@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. 利用HttpWebRequest通过POST Json数据在.net后台实现不同平台间的数据传输

    /// <summary> /// 返回JSon数据 /// </summary> /// <param name="JSONData">要处理 ...

  2. Aspose Words、Excel导出等操作

    /*Word先保存再输出-下载*/ strReportFilePath = Server.MapPath("~") + strReportFilePath; doc.Save(st ...

  3. “微信小程序” js部分注解

    1.小程序不提供获取dom的操作,而是让我们直接将事件绑定写入到组件内.区别在于bind不阻止冒泡,而catch阻止冒泡. <view id="tapTest" bindta ...

  4. 凸优化 & 1概念

    ---恢复内容开始--- 放射集合 系数之和为1 相加仍然能在集合内,就是 纺射集合 子空间加一个常熟 就是纺射集合 , 例题2.1 一类特殊的线性方程组的解可以看作纺射 集合 纺射包 aff C 是 ...

  5. bzoj 3895 取石子——博弈论

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3895 看题解:https://blog.csdn.net/popoqqq/article/d ...

  6. 关于在eclipse中安装各种插件的问题

    在eclipse中安装php插件的方法 参考转载链接:eclipse 安装php插件 并配置环境 elipse的php插件地址:https://www.eclipse.org/pdt/ 以下可能会用到 ...

  7. oracle触发器级联删除

    create or replace trigger delete_trigger1 after delete on contracting_party for each row begin if de ...

  8. SQL注入绕过的技巧总结

    sql注入在很早很早以前是很常见的一个漏洞.后来随着安全水平的提高,sql注入已经很少能够看到了.但是就在今天,还有很多网站带着sql注入漏洞在运行.稍微有点安全意识的朋友就应该懂得要做一下sql注入 ...

  9. SQL语句问题具体什么意思呢?

    SQL语句问题 底下SQL查询语法中的 as A 和 as B 是什么意思?为什么A和B不用定义就能用? 程序代码:     Private Sub LoadFileList(ByVal strSub ...

  10. 春蔚专访--MaxCompute 与 Calcite 的技术和故事

    摘要:2019大数据技术公开课第一季<技术人生专访>,来自阿里云计算平台事业部高级开发工程师雷春蔚向大家讲述了MaxCompute 与 Calcite 的技术和故事. 具体内容包括: 1) ...