题目描述
dzy 定义一个 $n^2$ 位的数的生成矩阵 $A$ 为一个大小为 $n \times n$ 且 Aij 为这个数的第 $i \times n+j-n$ 位的矩阵。
现在 dzy 有一个数 $n^2$ 位的数 k,他想知道所有小于等于 k 的数的 $n \times n$ 生成矩阵有多少种。(如果不足 $n^2$ 位则补前缀零)
输入输出格式
输入格式
第一行一个数 $n$,第二行一个 $n^2$ 位的数 $k$
输出格式
仅一行表示答案,答案可能很大,你只需输出答案对 $10^9 + 7$ 取模后的结果。
样例 1

输入1
2
1000
输出1
954
数据范围
对于 $30\%$ 的数据 $n \le 2$
对于 $100\%$ 的数据 $n \le 1000$,且 $n$ 为偶数
提示
如果两个生成矩阵在其中一个旋转 $\color{green}{180}$ 度后可以重叠,则称这两个矩阵是相同的。

题解:

这道题看了就一脸懵逼,大火题被说成了大水题了.........
言归正传:
先和网上一样贴公式:
设$f(i)$为$i$在$n^2$位中翻转后的数。
$$ans=k- \frac{\sum_{i}^{f(i) \in [1,k]}1 - \sum_{i}^{f(i) \in [1,k]}(f(i)==i)}{2}$$就是翻转之后的数的个数减去回文数,再除以2就是重复统计的数了。
设$$f[i][j][k],i \in [1,k],j \in [0,1],k \in [0,1]$$为当前枚举到第i位,前i位是否是严格的小于k的前i位的(是为1否为0),将前i位翻转之后的数是否是严格小于等于k的后i位的。那么答案为:
$$ans=k- \frac{(f[n][1][1]+f[n][0][1])-(f[n/2][1][0]+f[n/2][1][1]+f[n/2][0][1])}{2}$$
我们在枚举i,j,k和数字1~9时,就保证前i为严格小于等于,那么j=1就是严格小于,否则就是等于了。
$$(f[n][1][1]+f[n][0][1])$$是$$\sum_{i}^{f(i) \in [1,k]}1$$。前n位不管是小于还是等于,只要翻转之后也在1~n之间就行了。
$$(f[n/2][1][0]+f[n/2][1][1]+f[n/2][0][1])$$是$$\sum_{i}^{f(i) \in [1,k]}(f(i)==i)$$前n/2位翻转之后把后n/2位给补齐了,正好是一个回文数,那么前n/2位严格小于,自然满足条件,如果只是等于,就要翻转之后也是小于等于的。

 #include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register
using namespace std;
const int mod=;
long long int n,ans,GG,Two=,X,Y,Z;
char s[];
int a[],dp[][][];
int main()
{
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
cin>>n;
n*=n;
scanf("%s",s+);
for(int i=;i<=n;i++)
{
a[i]=s[i]-'';
GG=GG*+a[i];
GG%=mod;
}
dp[][][]=;
for(RG int i=;i<n;i++)
for(RG int j=;j<=;j++)
for(RG int k=;k<=;k++)
if(dp[i][j][k]!=)//加速(没卵用)
for(RG int l=;l<=;l++)//枚举i+1位的数字。
{
if(l<=a[i+]||j)//这一位要小于等于或者之前已经小于了。
{
RG bool b=(l<a[i+])||j;//这里不能取等号,因为j代表的是严格小于才为1。
RG bool c=(l==a[n-i]&&k)||(l<a[n-i]);//。。。严格的小于等于,因为n-i是从后往前的如果后面的相等,这以为自然可以相等,否则这以为必须严格小于才行。
dp[i+][b][c]+=dp[i][j][k];
dp[i+][b][c]%=mod;
}
else break;
}
X=(dp[n][][]+dp[n][][])%mod;
Y=(dp[n/][][]+dp[n/][][]+dp[n/][][])%mod;
Z=((X-Y)*Two)%mod;
ans=(GG-Z+mod)%mod;
cout<<ans<<endl;
return ;
}

大水题(water)的更多相关文章

  1. [BFS,大水题] Codeforces 198B Jumping on Walls

    题目:http://codeforces.com/problemset/problem/198/B Jumping on Walls time limit per test 2 seconds mem ...

  2. BZOJ_1621_[Usaco2008_Open]_Roads_Around_The_Farm_分岔路口(模拟+大水题)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1621\(n\)头奶牛,刚开始在一起,每次分成\(x\)和\(x+m\)两部分,直到不能再分,问 ...

  3. 第三届山西省赛1004 一道大水题(scanf)

    一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...

  4. PAT甲题题解-1101. Quick Sort (25)-大水题

    快速排序有一个特点,就是在排序过程中,我们会从序列找一个pivot,它前面的都小于它,它后面的都大于它.题目给你n个数的序列,让你找出适合这个序列的pivot有多少个并且输出来. 大水题,正循环和倒着 ...

  5. PAT甲题题解-1117. Eddington Number(25)-(大么个大水题~)

    如题,大水题...贴个代码完事,就这么任性~~ #include <iostream> #include <cstdio> #include <algorithm> ...

  6. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  7. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  8. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  9. HDU-5504(逻辑if-else大水题)

    Problem Description You are given a sequence of N integers. You should choose some numbers(at least ...

随机推荐

  1. 洛谷—— P1462 通往奥格瑞玛的道路

    https://www.luogu.org/problem/show?pid=1462 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主 ...

  2. 51nod 1499 (最小割)

    题意 分析 将一些点分成两个集合,很明显的最小割问题 设一个S.T,和S相连的点表示在B集合中,和T相连的点表示在A集合中 因为原题是完美值最大,我们转换一下,变成损失的价值最小,那么就是最小割问题了 ...

  3. java collection集合

    集合:用于存储对象的容器.集合中可以存储任意类型的对象,长度可变. 集合和数组的比较 集合和数组都是存储对象的容器,不同的是,数组可以存储基本数据类型(int.short.long.char.Bool ...

  4. Java子类重写父类方法注意问题收集(转)

    子类不能重写父类的静态方法,私有方法.即使你看到子类中存在貌似是重写的父类的静态方法或者私有方法,编译是没有问题的,但那其实是你重新又定义的方法,不是重写.具体有关重写父类方法的规则如下: 重写规则之 ...

  5. 打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决

    1.异常代码 <style> .box{ min-height: 100vh; width: 100%; position: relative; } .position{ position ...

  6. iphone5s 耳机更换插头 EarPods change jack

    iphone5s 耳机使用了不到两年,出现了接头接触不良,话筒线短路的状况,经常自动出现暂停或者siri.买了一个新耳机,这几天有时间,把旧耳机修好了,更换了一个新的插头.   工具/原料   剥线钳 ...

  7. [转] ubuntu 下mongodb的安装-----这篇文章也不错

    在Ubuntu下进行MongoDB安装步骤 一. 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作): 1.运行"apt-get install mongo" 如果遇到 ...

  8. 实例 mount新硬盘方法

    0.建立挂载文件夹: mkdir /mnt/sdb1 1 .查看新硬盘: fdisk -l 2. 硬盘分区: fdisk /dev/sdb1 根据提示,依次输入 n, p, 1, 以及两次回车,然后是 ...

  9. 理解Android ANR的触发原理(转)

    一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ...

  10. Android中个人推崇的数据库使用方式

    手机应用开发中常常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库.在上层进行了一层封装,同一时候还为我们提供了ContentProvider的框架.方便我们进 ...