题目描述
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. Java实验--课上提到的随机数生成原理简单实现(不利用库生成随机数的简单算法)

    对于随机数的实验,根据课程上的教程,有如下的公式: 对应的变量参数的说明: 其中对应的Mouduls变量对应的就是公式中a的值,在公式中的含义就是相当于要循环多少个数才重复的一个值. Multipli ...

  2. Java学习--反码 原码 补码简析

    关于课上实验中对小数的处理中出现的问题涉及到原码,反码,补码的问题,所以在网上进行了一下搜索.在原码,反码,补码中的解释可得知,无论是哪一种码,能够表示的数的范围是-2^(位数-1)+1至2^(位数- ...

  3. hdu 1385 Minimum Transport Cost(floyd &amp;&amp; 记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  4. 浏览器websocket

    使用浏览器,PHP 来构建的应用,发现都是每次浏览器发送一次http 请求,PHP 回一个响应. 这样,后端的PHP 在处理多次http请求是,每次都是不同的进程在处理. 这就加大了开销, 而且,PH ...

  5. 对dispatch_async到主线程的逻辑封装成C/C++接口类型

    背景:代码里面有时候会把将要运行的内容放到主线程里面运行,但假设已经是主线程里面的代码调用dispatch_async的时候偶尔会出现crash,所以就须要推断是否已经在主线程里面了. 通常的做法类似 ...

  6. 微信小程序-setData()方法

    一般setData方法多用于点击后改变页面信息或者刷新后与后台交互获取最新的信息 注意: 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致 ...

  7. 战五渣系列之八(绝杀AOP)

    开发不用aop.程序猿的人生该会浪费多少时间.我想是时候让程序猿打败alpha狗了.程序猿解救世界. 1.概念 面向切面编程.这意味着,一切不在流水线上的东西.包含权限.日志.缓存.校验.资源.事物. ...

  8. 程序运行中(BSS段、数据段、代码段、堆栈)

    程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...

  9. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  10. LoadRunner---http请求中对中文参数的处理

    Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...