@description@

在三维空间内有 N 个不同的点,请计算下面式子的值 Q 次:

\[\sum_{i\not = j}\frac{|A(x_i-x_j) + B(y_i-y_j) + C(z_i - z_j) + D|}{N*(N-1)*\sqrt{(x_i-x_j)^4 + (y_i-y_j)^4 + (z_i-z_j)^4}}
\]

其中 A、B、C 和 D 在每次计算中都会被重新指定。

输入格式

输入数据第一行包含两个整数 N 和 Q,分别表示点的数量和询问的次数。

接下来的 N 行,每行包含三个整数 Xi、Yi 和 Zi 表示点坐标。

接下来的 Q 行,每行包含 4 个整数 A、B、C 和 D,表示一次询问。

输出格式

对于每次询问,输出一行包含相应的答案,精确到 10^(−6) 以上。

数据范围

• 2 ≤ N ≤ 777777

• 1 ≤ Q ≤ 77

• 1 ≤ Xi,Yi,Zi ≤ 77

• 1 ≤ Ai,Bi,Ci ≤ 77

• 1 ≤ Di ≤ 7777

• 愿数字 7 给你带来好运

样例数据

输入

10 5

45 70 41

9 1 43

1 68 8

70 76 7

1 19 33

71 70 53

42 54 71

11 13 30

16 63 25

30 24 34

56 61 29 7328

63 32 18 365

37 41 11 2332

36 19 43 7432

68 55 46 6338

输出

6.692386875130186

1.323651551014940

2.269817185835997

6.783038317971530

5.816449269601737

@solution@

还以为是什么神仙推式子数学题。。。结果没想到就是道 sb 题 -_-。。。

考虑题目给定的式子,实际上与 xi, xj 这些变量无关而只与 (xi - xj), (yi - yj), (zi - zj) 这三个量有关。

于是我们只需要统计各个三元组分别的出现次数,就可以在 (77*2)^3 时间内完成一次询问。

考虑在一维的时候,实际上就是给你 n 个不同的数 x[1...n],对于每个非零的 a 求 \((\sum_{x[i]-x[j]=a}1)\)。

woc 这么像一个卷积,那我们就构造一个卷积得了。

令 \(f(p) = \sum_{i=1}^{n}p^{x_i}, g(p) = \sum_{i=1}^{n}p^{-x_i}\),把 f 和 g 作卷积就好了。

负指数幂加一个常数就变成正指数了。

三维的就用高维卷积,实际上就是把它转为 2*77 进制数,最低位为 x,次第位为 y,以此类推。

因为点互不相同,所以一个点对一个三元组的贡献最多为 1,那么答案不超过 N。所以 ntt 不会产生问题。

时间复杂度 O((77*2)^3*q + (77*2)3*log((77*2)3))

@accepted code@

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int G = 3;
const int MOD = 998244353;
const int N = 77;
const int M = 4194304;
int pow_mod(int b, int p) {
int ret = 1;
while( p ) {
if( p & 1 ) ret = 1LL*ret*b%MOD;
b = 1LL*b*b%MOD;
p >>= 1;
}
return ret;
}
int pw[25], ipw[25];
void ntt(int *A, int len, int type) {
for(int i=0,j=0;i<len;i++) {
if( i < j ) swap(A[i], A[j]);
for(int k=(len>>1);(j^=k)<k;k>>=1);
}
for(int i=1;(1<<i)<=len;i++) {
int s = (1<<i), t = (s>>1);
int u = (type == 1 ? pw[i] : ipw[i]);
for(int j=0;j<len;j+=s) {
for(int k=0,p=1;k<t;k++,p=1LL*p*u%MOD) {
int x = A[j+k], y = 1LL*A[j+k+t]*p%MOD;
A[j+k] = (x + y)%MOD, A[j+k+t] = (x + MOD - y)%MOD;
}
}
}
if( type == -1 ) {
int inv = pow_mod(len, MOD-2);
for(int i=0;i<len;i++)
A[i] = 1LL*A[i]*inv%MOD;
}
}
void init() {
for(int i=0;i<25;i++)
pw[i] = pow_mod(G, (MOD - 1)/(1<<i)), ipw[i] = pow_mod(pw[i], MOD - 2);
}
int n, q;
double a, b, c, d;
double pw4(double x) {
return x*x*x*x;
}
double func(double x, double y, double z) {
return fabs(a*x + b*y + c*z + d)/sqrt(pw4(x) + pw4(y) + pw4(z))/n/(n-1);
}
int A[2*N + 5][2*N + 5][2*N + 5], B[2*N + 5][2*N + 5][2*N + 5], C[2*N + 5][2*N + 5][2*N + 5];
int f[M], g[M];
int main() {
init(); scanf("%d%d", &n, &q);
for(int i=1;i<=n;i++) {
int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z);
X--, Y--, Z--; A[X][Y][Z]++;
}
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
B[i][j][k] = A[N-i-1][N-j-1][N-k-1];
for(int i=0;i<2*N-1;i++)
for(int j=0;j<2*N-1;j++)
for(int k=0;k<2*N-1;k++)
f[(i*(2*N-1) + j)*(2*N-1) + k] = A[i][j][k], g[(i*(2*N-1) + j)*(2*N-1) + k] = B[i][j][k];
ntt(f, M, 1), ntt(g, M, 1);
for(int i=0;i<M;i++)
f[i] = 1LL*f[i]*g[i]%MOD;
ntt(f, M, -1);
for(int i=0;i<2*N-1;i++)
for(int j=0;j<2*N-1;j++)
for(int k=0;k<2*N-1;k++)
C[i][j][k] = f[(i*(2*N-1) + j)*(2*N-1) + k];
/*
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
for(int p=0;p<N;p++)
for(int q=0;q<N;q++)
for(int r=0;r<N;r++)
C[i+p][j+q][k+r] = (C[i+p][j+q][k+r] + 1LL*A[i][j][k]*B[p][q][r]%MOD)%MOD;
*/
for(int i=1;i<=q;i++) {
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
double ans = 0;
for(int i=-(N-1);i<=N-1;i++)
for(int j=-(N-1);j<=N-1;j++)
for(int k=-(N-1);k<=N-1;k++)
if( (i || j || k) && C[N-1+i][N-1+j][N-1+k] )
ans += C[N-1+i][N-1+j][N-1+k]*func(i, j, k);
printf("%.10lf\n", ans);
}
}

@details@

其实高维卷积还可以通过一维一维的 ntt 来搞,这样子 log 会小些,但是边长会由 77*2 变为 256,反而会慢些。

看来以后想题不能直接想复杂的,要坚定地认为“既然出题人出得出来那它一定可以做”。

@codechef - MGCH3D@ 3D Queries的更多相关文章

  1. CodeChef DISTNUM2 Easy Queries 节点数组线段树

    Description You are given an array A consisting of N positive integers. You have to answer Q queries ...

  2. codechef Tree and Queries Solved

    题目链接: https://www.codechef.com/problems/IITK1P10 大概是:修改点值,求子树节点为0有多少个, DFS序后,BIT 询问,修改 ;    {        ...

  3. scau 2015寒假训练

    并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...

  4. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

  5. [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)

    [BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...

  6. Codechef Dynamic Trees and Queries

    Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...

  7. 【CodeChef】Chef and Graph Queries

    Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...

  8. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  9. CodeChef Gcd Queries

    Gcd Queries   Problem code: GCDQ   Submit All Submissions   All submissions for this problem are ava ...

随机推荐

  1. 洛谷P2178 [NOI2015]品酒大会

    题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...

  2. python 处理缺失数据

  3. 【CodeVS】1023 GPA计算

    1023 GPA计算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 小松终于步入了大学的殿堂,带着兴奋和憧憬,他参加了信息科学 ...

  4. Leetcode54. Spiral Matrix螺旋矩阵

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ...

  5. LUGOU 3959 宝藏 (noip 2017 day2 T2)

    传送门 解题思路 去年noip现在拿来写..思路还是听清楚的,记忆化搜索,f[S]表示现在选了集合S时的最小代价,dis[i]表示达到最优时i这个点的深度.f[S| (1< < i-1) ...

  6. web前端学习(二)html学习笔记部分(7)--web存储2

    1.2.20  web存储 1.2.20.1  Web存储-客户端存储数据新方法 1.两种方式 1)localStorage - 没有时间限制的数据存储 2)针对一个sessionStorage - ...

  7. Android——系统权限

    Android是一个特权分隔的操作系统,每一个应用程序运行在不同的系统身份中(Linux的user ID和group ID).系统部分和不同的身份被隔离开来.因此,Linux隔离了应用程序(与其它程序 ...

  8. 2017年浙工大迎新赛热身赛 A 毕业设计选题 【结构体排序】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 又到了一年一度,大四老学长们毕业设计选题的时候, ...

  9. Spring Boot:Boot2.0版本整合Neo4j

    前面介绍了Boot 1.5版本集成Neo4j,Boot 2.0以上版本Neo4j变化较大. 场景还是电影人员关系 Boot 2.0主要变化 GraphRepository在Boot2.0下不支持了,调 ...

  10. replace all

    OPTION COPY OUTREC FINDREP=(INOUT=(X'0E',X'400E', X'0F',X'0F40'))