题目描述
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. HDU 2255 二分图最佳匹配

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. C. Wilbur and Points---cf596C

    http://codeforces.com/problemset/problem/596/C 题目大意:  给你n个数对  确保如果(x,y)存在这个集合  那么  0<=x'<=x &a ...

  3. Pick-up sticks--poj2653(判断两线段是否相交)

    http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个 分析:  我刚开始想倒着遍历  因为n是100000   想着会 ...

  4. [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4896  Solved: 1824[Submit][Statu ...

  5. VB程序逆向反汇编常见的函数(修改版)

    VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str    将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,7 ...

  6. 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)

    原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...

  7. Linux中查看文件或者文件夹大小

    df -l 查看磁盘空间大小命令 df -hl  查看磁盘剩余空间 df -h  查看每个根路径的分区大小 du -sh  当前文件夹下所有文件大小(包括子文件大小 du -sm  [文件夹] 返回该 ...

  8. 提示:“请检查浏览器代理设置”/xx-net

    1.删除已导入的证书文件(运行certmgr.msc和certlm.msc,然后自己找到xxnet删),2.更新3.3.1(或是自己找到那行代码取消注释,楼下有人提及)3.删除data文件夹(下的ce ...

  9. HDU 1160 FatMouse&#39;s Speed(DP)

    题意  输入n个老鼠的体重和速度   从里面找出最长的序列  是的重量递增时速度递减 简单的DP  令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度  对与每一个老鼠i  遍历全部老鼠j  当 ...

  10. 云上领跑,快人一步:华为云抢先发布Redis5.0

    12月17日,华为云在DCS2.0的基础上,快人一步,抢先推出了新的Redis 5.0产品,这是一个崭新的突破.目前国内在缓存领域的发展普遍停留在Redis4.0阶段,华为云率先发布了Redis5.0 ...