@topcoder - TCO19 Regional Wildcard Wildcard Round - D1L2@ Diophantine
@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的更多相关文章
- Makefile关键字
@ makefile会把将要执行的命令行在命令执行前输出到屏幕上,使用@可以避免显示出命令本身 若@ echo 正在编译-则$make显示正在编译- 若echo 正在编译-则$make显示: echo ...
- beego路由实现原理
树形结构+递归算法实现路由的注册与匹配: 1 数据结构: // 树节点结构type Tree struct { //search fix route first fixrouters map[stri ...
- (转)How to build an Apple Push Notification provider server (tutorial)
转自:https://blog.serverdensity.com/how-to-build-an-apple-push-notification-provider-server-tutorial/ ...
- Linux 通过HTTP进行域名更新
一.3322动态域名更新接口 接口地址 API URL http://members.3322.net/dyndns/update HTTP请求 GET /dyndns/update?hostname ...
- [Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等
1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...
- 转-Windows路由表配置:双网卡路由分流
原文链接:http://www.cnblogs.com/lightnear/archive/2013/02/03/2890835.html 一.windows 路由表解释 route print -4 ...
- Docker+Jenkins持续集成环境(5): android构建与apk发布
项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...
- [Python] wxPython 高防Windows10记事本 (end...)
1.开始 接触Python 也有一段时间了,o.o ,断断续续加起来没几天. 一般新学习一门新语言,除了必先输出一个 Hello World 外,都会以模拟 Windows 记事本来写一个结合自己想法 ...
- Linux 下 make 命令 及 make 笔记
Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make ...
随机推荐
- 「G2016 SCOI2018 Round #2」B
传送门 杜教筛的简单题. 莫比乌斯反演一下,然后杜教筛.
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- C# 基础才是重中之重~对象的生与死
为何要写 之所以写这篇文章,完全是因为学生们在实际开发中遇到的问题,一个对象占用的内存空间总不被释放,导致系统内存不断攀升,其最主要原因是我们对“对象的生与死”不清楚,或者从来没有认真去考虑过这件事, ...
- 各种语言web性能简单对比测试
忽然想比较一下 python nodejs go 的web 响应,就简单的写了个性能对比测试. 测试目标:1 . i5 4核 32G 同一机器 linux 2. 用python(flas ...
- SpringCloud-微服务的注册与发现Eureka
一.SpringCloud简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...
- 在Mac下安装MySQL
在Mac下安装MySQL 最近开始将开发工具都转移到 Mac 上了,其中也会莫名其妙的遇到一些坑,不如干脆将整个流程都记录下来,方便以后查找. 下载与安装 首先进入 MySQL 官网,选择免费的C ...
- oracle 监听配置文件路径
app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN listener.ora tnsnames.ora 配置监听直接在 tnsnames.o ...
- Java中用JXL导出Excel代码详解
jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支 ...
- css不定高图文垂直居中的三种方法
html部分 <div class="box"> <img class="img" src="http://p2.so.qhmsg. ...
- 2019-3-1-win10-uwp-发布旁加载自动更新
title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindexi 2019-03-01 09:40:27 +0800 2019-0 ...