CF300D Painting Square
Painting Square
https://codeforces.com/problemset/problem/300/D
给了一个理解起来较复杂但是本质上很简单的分形。
题解
很显然,只有边长为大于等于3且为奇数的正方形能被操作,并且每一次的操作方式是唯一的:沿中心将正方形分成四个等大的小正方形。
我们令操作次数为M,表示大小为N的正方形可以被分割缩小的次数(即每次分割一个存在的最小的正方形),\(dp_{M,K}\)表示一个操作次数为M的正方形中,操作K次的方案数。
则有:
\]
7340033是NTT模数,原根为3,NTT卷积转移即可。
时间复杂度O(Q log N+K log N log K)。
CO int N=4096;
int dp[31][N],tmp[N];
int rev[N],omg[N];
void NTT(int a[],int lim){
for(int i=0;i<lim;++i)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int i=1;i<lim;i<<=1)
for(int j=0;j<lim;j+=i<<1)
for(int k=0;k<i;++k){
int t=mul(omg[lim/(i<<1)*k],a[j+i+k]);
a[j+i+k]=add(a[j+k],mod-t),a[j+k]=add(a[j+k],t);
}
}
int main(){
int len=log2(N),lim=N;
for(int i=0;i<lim;++i) rev[i]=rev[i>>1]>>1|(i&1)<<(len-1);
omg[0]=1,omg[1]=fpow(3,(mod-1)/lim);
for(int i=2;i<lim;++i) omg[i]=mul(omg[i-1],omg[1]);
dp[0][0]=1;
for(int i=1;i<31;++i){
copy(dp[i-1],dp[i-1]+lim,tmp);
NTT(tmp,lim);
for(int j=0;j<lim;++j) tmp[j]=fpow(tmp[j],4);
omg[0]=1,omg[1]=fpow(omg[1],mod-2);
for(int i=2;i<lim;++i) omg[i]=mul(omg[i-1],omg[1]);
NTT(tmp,lim);
dp[i][0]=1;
int ilim=fpow(lim,mod-2);
for(int j=1;j<1005;++j) dp[i][j]=mul(tmp[j-1],ilim); // edit 1
omg[0]=1,omg[1]=fpow(omg[1],mod-2);
for(int i=2;i<lim;++i) omg[i]=mul(omg[i-1],omg[1]);
}
for(int q=read<int>();q--;){
int n=read<int>(),k=read<int>();
int m=0;
for(;n>1 and n&1;n>>=1) ++m;
printf("%d\n",dp[m][k]);
}
return 0;
}
尽管暴力卷积的时候第二维大于1000的DP值无关紧要,但是DP记录的时候只能记录前1000个,记录后面的就会错。这大概是因为如果记录了后面的DP值,那么插值的项数就不够了,导致了循环卷积。
CF300D Painting Square的更多相关文章
- [CodeForces 300D Painting Square]DP
http://codeforces.com/problemset/problem/300/D 题意:每一次操作可以选一个正方形,令边长为n,如果n为奇数那么可以从中间画一个十字,分成4个大小相等的边长 ...
- Codeforces Round #181 (Div. 2)
A. Array 模拟. B. Coach 模拟. C. Beautiful Numbers good number的位和最大不超过\(10^7\),那么只要枚举a或b的个数,然后最多循环7次判断位和 ...
- Codeforces Round #353 (Div. 2)Restoring Painting
Vasya works as a watchman in the gallery. Unfortunately, one of the most expensive paintings was sto ...
- bzoj3905: Square
Description Nothing is more beautiful than square! So, given a grid of cells, each cell being black ...
- codeforces 675B B. Restoring Painting(暴力枚举)
题目链接: B. Restoring Painting time limit per test 1 second memory limit per test 256 megabytes input s ...
- Codeforces Round #423 B. Black Square
题目网址:http://codeforces.com/contest/828/problem/B 题目: Polycarp has a checkered sheet of paper of size ...
- Codeforces 828B Black Square(简单题)
Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n × m. ...
- Codeforces828 B. Black Square
B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- hdu 5079 Square
http://acm.hdu.edu.cn/showproblem.php?pid=5079 题意: n*n网格,每个格子可以涂黑色或白色,有的格子必须涂黑色 问最大白色正方形边长分别为0,1,2,… ...
随机推荐
- Prometheus部署各服务的Node监控
1.部署监控主机 部署主机监控,需要安装node_exporter 1.1 下载node exporter wget https://github.com/prometheus/node_export ...
- python文件打包发布(引用的包也可以加进来),打包出错解决了,运行出错解决了
一开始,我以为,打包本来就很容易,可是没有..... 没想到打包还能遇到坑 T.T 打包步骤: 1.安装 pyinstaller (cmd) pip install pyinstaller 2.进入目 ...
- 利用Travis IC实现Hexo博客自动化部署
1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...
- Python变量问题:命名、类型、赋值
1.变量问题 1.1变量命名: (1)变量名只能包含字母.数字和下划线.变量名可以字母或下划线开头,但不能以数字开头.例如,name1_,_name1都是合法的,但1name就不行(2)变量名中间不能 ...
- Phenix.NET for CSLA & WF4,企业级、分布式、符合领域建模的OOP软件快速开发平台
2014-5-20版本: Phenix.NET for CSLA & WF 开发平台: http://download.csdn.net/download/phenixiii/7390405 ...
- Web应用调用.Net Core API
Web应用调用.Net Core API 一.新建Web Application应用: 选择Web Application 新建好之后页面如下: 二.新建Model.新建Model文件夹并建立apiM ...
- 服务器收不到支付宝notify_url异步回调请求的问题 支付宝notify 异步通知与https的问题
需确认页面是http还是https,如果是https,那么需要安装ssl证书,证书要求有如下:要求“正规的证书机构签发,不支持自签名”. 然后赶快,按照支付宝,宝爷的要求,去自检了一下自家的证书,下面 ...
- jquery设置css,animate设置多个属性
$("p").css("color","red"); $("p").css({ "font-size" ...
- 创建mybatis的逆向工程
1.mybatis的逆向工程(我使用的是maven仓库创建) 工作原理:反向工程(通过数据库中的表和字段信息去生成对应的增删改查方法) 其实就是一个自动生成工具 生成实体类(pojo)和映射文件(ma ...
- 【译】itertools
1.Itertools模块迭代器的种类 1.1 无限迭代器: 迭代器 参数 结果 示例 count() start, [step] start, start+step, start+2*step, ...