题目大意:


给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数。

\(n<=50,p=2、3,0<=a[i][j]<p^7\)

题解:


又是排列,不妨考虑行列式:

\(|A|=\sum_{p是排列}(-1)^{p的逆序对个数} \prod A[i][p[i]]\)

这里的A是一个集合幂级数,×定义为k进制不进位加法卷积。

假设我们直接做高斯消元求行列式,发现由于\((-1)^?\)次方,可能导致本来≠0而加起来为0,所以需要随机一个系数作为集合幂级数的系数。

带着这么个集合幂级数去高斯消元显然不太行,假设p=2,不妨先FWT,这样卷积就变成了点积,并且点积不同位之间没有影响,所以可以先枚举是哪一位,再消元。

这样的话复杂度是\(O(n^3*p^7)\)。

那么问题就在于如何做p进制的FWT。

发现FWT的本质就是构造一个可逆的转移矩阵,这里转移矩阵需要满足做出来点积后是k进制不进位加法,也就是k的循环溢出,那么不妨直接用FFT的单位复数根去完成这个东西。

即转移矩阵\(b[i][j]=w_k^{ij}\),逆FWT就是\(w_k^{-ij}/k\)。

\(w_k\)可以取FFT的\((cos(2*\pi/k),sin(2*\pi/k)*i)\),也可以NTT那样取一个\(p|(mo-1)\)的质数mo,然后用\(原根^{(mo-1)/k}\)

#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
#define db long double
using namespace std; int rand(int x, int y) {
return ((ll) RAND_MAX * rand() + rand()) % (y - x + 1) + x;
} const int mo = 1e9 + 9; ll ksm(ll x, ll y) {
ll s = 1;
for(; y; y /= 2, x = x * x % mo)
if(y & 1) s = s * x % mo;
return s;
} int num, n, k, a[51][51];
ll w[3];
void fwt(ll *a, int n, int f) {
ll v = ksm(ksm(13, (mo - 1) / k), f == 1 ? 1 : mo - 2);
w[0] = 1; ff(i, 1, k) w[i] = w[i - 1] * v % mo;
for(int h = 1; h < n; h *= k) {
for(int j = 0; j < n; j += k * h) {
ff(i, 0, h) {
ll c[3]; ff(u, 0, k) c[u] = 0;
ff(u, 0, k) ff(v, 0, k) c[v] += a[i + j + h * u] * w[u * v % k] % mo;
ff(u, 0, k) a[i + j + h * u] = c[u] % mo;
}
}
}
if(f == -1) {
v = ksm(n, mo - 2);
ff(i, 0, n) a[i] = a[i] * v % mo;
}
} const int N = 2187 + 5; int m;
ll b[51][51][N], c[N], d[51][51]; ll solve(ll a[][51]) {
ll s = 1;
fo(i, 1, n) {
int u = i;
fo(j, i, n) if(a[j][i]) { u = j; break;}
if(i != u) {
fo(j, 1, n) swap(a[i][j], a[u][j]);
s *= -1;
}
ll ni = ksm(a[i][i], mo - 2);
fo(j, i + 1, n) if(a[j][i]) {
ll v = -a[j][i] * ni % mo;
fo(k, 1, n) a[j][k] = (a[j][k] + a[i][k] * v) % mo;
}
}
fo(i, 1, n) s = s * a[i][i] % mo;
return s;
} int main() {
srand(time (0) + clock());
freopen("astrology.in", "r", stdin);
freopen("astrology.out", "w", stdout);
scanf("%d %d %d", &num, &n, &k);
m = 1; fo(i, 1, 7) m = m * k;
fo(i, 1, n) fo(j, 1, n) scanf("%d", &a[i][j]);
fo(i, 1, n) fo(j, 1, n) {
b[i][j][a[i][j]] = rand(1, mo - 1);
fwt(b[i][j], m, 1);
}
solve(d);
ff(u, 0, m) {
fo(i, 1, n) fo(j, 1, n) d[i][j] = b[i][j][u];
c[u] = solve(d);
}
fwt(c, m, -1);
ff(i, 0, m) if(c[i]) pp("%d ", i);
}

2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)的更多相关文章

  1. 2018.10.04 NOIP模拟 K进制(模拟)

    传送门 签到题,直接瞎模拟就行了. 代码

  2. 颜色转换、随机、16进制转换、HSV

    颜色转换.随机.16进制转换.HSV: /** * * *-----------------------------------------* * | *** 颜色转换.随机.16进制转换.HSV * ...

  3. 数据结构之【栈】+十进制转d进制(堆栈数组模拟)

    其实这篇文章开出来主要是水文章%% %% 栈--后进先出的婊 特点:只能在某一端插入和删除的特殊的线性表 操作:进栈--PUSH->向栈顶插入元素 出栈--POP-->将栈顶元素删除 实现 ...

  4. JS一行代码,生成一个16进制随机颜色,简单粗暴。

    var color = '#'+ Math.random().toString(16).substr(-6); document.body.style.backgroundColor = color; ...

  5. jmeter测试TCP服务器/模拟发送TCP请求 设置16进制发送(转)

    转载留存:http://blog.sina.com.cn/s/blog_46d0362d0102v8ii.html 性能测试需要模拟多种场景,经常受制于资源限制,没办法建立贴近实际部署环境的场景.因而 ...

  6. hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)

    TIANKENG’s restaurant(Ⅱ) Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 130107/65536 K (Ja ...

  7. HDU4814——数学,模拟进制转换

    本题围绕:数学公式模拟进制转换 HDU4814 Golden Radio Base 题目描述 将一个十进制的非负整数转换成E(黄金分割数)进制的数 输入 不大于10^9的非负整数,处理到文件尾 输出 ...

  8. C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理

    以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...

  9. 原生JS代码实现随机产生一个16进制的颜色值

    封装一个函数 function getColor() { var str = "#"; //一个十六进制的值的数组 var arr = ["0", " ...

随机推荐

  1. java中接口有什么用

    1.通过接口可以实现不相关类的相同行为,而不需要了解对象所对应的类. 2.通过接口可以指明多个类需要实现的方法. 3.通过接口可以了解对象的交互界面,而不需了解对象所对应的类. 另:Java是单继承, ...

  2. Python-UiAutomator2实现Android自动化测试

    本帖转自搜狗测试公众号 [一.前言]        基于Python-UiAutomator2实现Android自动化测试,小编在Android应用的自动化性能测试中进行了实践.本篇将简单介绍pyth ...

  3. Spring注解详解(转)

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  4. jsp网站访问次数统计的几种方法

    我采用的是jsp网页,但是不管采用什么语言,原理是一样的. 第一种,单页面统计.就是说,只要点击这个页面就会统计一次. <body> <%!//在这种标记中定义的变量为全局变量 in ...

  5. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  6. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  7. postgreSQL的主外键

    --添加主键 alter table cities add PRIMARY KEY(name); --添加外键 alter table weather add FOREIGN key(city) RE ...

  8. 四:RF框架appium工具之xpath定位

    XPATH定位方法具体的学会,还是在今年1月份,以前运用的都不熟练. 这个定位神器是一定要掌握的,不然有你抓狂的时候. 第一要掌握它的书写格式,这个好上手. 第二要掌握它的具体用法.这个就要多练习了, ...

  9. Robotframework之下拉列表select

    下拉框控件很常见啊,主要说一下robotframework中怎么玩转下拉框,第一点要注意的就是,别看到下拉的就用select控件去操作,因为很多下拉列表用的不一定就是select控件.robotfra ...

  10. linux jps命令

    原文链接: http://www.cnblogs.com/qlqwjy/p/7928410.html https://blog.csdn.net/u013250071/article/details/ ...