首页 > 其他分享 >ybtoj 1.1.4 序列个数

ybtoj 1.1.4 序列个数

时间:2022-10-03 08:55:56浏览次数:55  
标签:orz 1.1 ybtoj sto 矩阵 个数 include 我们 define

一道很有趣的题

能空手AC的都是大佬

 

 乍一看 感觉跟递推没啥大关系()

事实上 我们要把这个问题展开成一个二维的平面(能想出来这个的我sto orz sto orz sto orz sto orz sto orz sto orz sto orz sto orz sto orz sto orz)

形如

1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0 1

我们把矩阵的行i和列j定义为 :(i,j)表示在序列的第i位有j这个数;

所以该矩阵表示序列 1 4 2 3 5

这样一来 当我们想求解时 就把问题形象化了

我们可以看到 当问题有解时 a[i] 是 单调不降的

因为不可能存在当前i个序列位有a[i]个比i小的数 但前i + 1 个却有a[i + 1]个比i小的数 且a[i + 1] < a[i] i越大反而越少

并且我们知道 bi是随机的(只要在1 - n且不重复即可)

所以我们可以考虑用a[i] 转移

那联系到刚才的矩阵 a[i]又表示什么呢(?)

不难看出 每次转移时 转移所用的序列长为 i 并且此时的n也等于i(长为i其实也就是n为i) 所以a[i]掌管了前i *i个位置

那么也就是说 a[i] 表示 矩阵的前i * i位中有几个1

我们来证明一下:

在i * i的矩阵当中

行数为i 则满足"序列前i个位置"

列数为i 则满足“小于等于i的数”(因为此时的最大值n等于i 而b满足元素范围为1 - n);

则 成立

那么我们就考虑一下转移:

每次转移时 我们就可以考虑a[i] 和 a[i - 1] 的关系

当a[i] - a[i -1] < 0时 则如我们所说 不满足单调不降 则无解 直接输出0 结束程序

当a[i] - a[i -1] == 0时 也就是说 前i位被限制的数的个数和前i + 1位限制的个数一致 根据此题转移的单调不减的性质 则不需要任何的变动

当a[i] - a[i -1] == 1时 也就是说 我们需要在这个已经填充好的i * i的矩阵外面1层再填一个1 满足在横纵方向不与任何一个已经填好的1相交

此时我们来考虑答案

当矩阵长宽均为i时 矩阵面积为i * i 当矩阵长宽均为i - 1时 矩阵面积为(i - 1) * (i - 1);

则多出来的面积为i * i - (i - 1) * (i - 1)  = 2 * i - 1;

那也就是说 我们有2 * i - 1个位置可以用来填数

但是 别忘了我们所述的不相交的特性

所以 我们必须避开已经填好的数

在(i - 1) * (i -1 ) 的矩阵中 我们已经填好了a[i - 1]个数 那也就是说 有 2 * a[i -1]个位置是不能填的 因为他们已经被填上后 他们所在那一行和那一列就不能再填了

那么此时 转移方程就出来了:

 a n s ∗ = ( i ∗ 2 − 1 − 2 ∗ a [ i − 1 ] );

当a[i] - a[i -1] == 2时 也就是说 我们需要在这个已经填充好的i * i的矩阵外面1层再填两个1 满足在横纵方向不与任何一个已经填好的1相交

此时我们来考虑答案

在一个i * i的矩阵中 他每行 / 列都比(i - 1) * (i - 1)的矩阵多1

然而别忘了 行与列有一个相交点 那就是 (i,i);

那也就是说 其实多出来的是 i  +  i - 1个位置

如果我们想保证之前所提到的不重合的要求成立 又想满足在外圈同时填两个数 那么 (i ,i)这个点就是万万不能填的了 因为填上它以后 无论是行还是列都会与另一个被填的数相交

那么也就是说 我们又失去了一个位置

此时 我们还有i + i - 1 - 1个位置

我们把二维压回一维来看

是不是也就相当于 我们在每行 / 列 多了 i - 1个位置(?)

同理于上文 我们还要去掉已经填好的a[i - 1]个位置

那么相对于每行 / 列而言 我们可填的位置有(i - 1 - a[i - 1])个

根据乘法原理 我们即可统计答案

 a n s ∗ = pow(( i  − 1 − a [ i − 1 ] ),2);

当a[i] - a[i -1] > 2时 不难看出 此时无论怎么填 都会存在行列相交的情况(如果不理解行列相交 请移步八皇后问题 想象此问题为在斜线上可以相交的N皇后问题)

则 无解 输出0 结束程序

到此 此题完成

很爽的一道题 博客写了好久 改天再润色

上代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstdio>
 5 #include <climits>
 6 #include <cassert>
 7 #include <cstring>
 8 #include <cstdlib>
 9 #include <cctype>
10 #include <iomanip>
11 #include <utility>
12 #include <set>
13 #include <map>
14 #include <list>
15 #include <stack>
16 #include <queue>
17 #include <deque>
18 #include <vector>
19 #include <bitset>
20 #include <ctime>
21 #define int long long
22 #define ll long long
23 #define ull unsigned long long
24 #define re register
25 #define mod1 998244353
26 #define mod2 100000007
27 #define lowbit(x) x & (-x)
28 #define gcd(a,b) __gcd(a,b)
29 #define mid ((l + r) >> 1)
30 #define rep(i,a,b)  for(re int i(a);i <= b;++ i)
31 #define rrep(i,a,b) for(re int i(a);i >= b;i --)
32 using namespace std;
33 inline int read(){
34     re int x = 0,f = 1;
35     re char ch = getchar();
36     while(ch < '0' || ch > '9'){
37         if(ch == '-') f = -1;
38         ch = getchar();
39       }
40     while(ch >= '0' && ch <= '9'){
41         x = (x << 3) + (x << 1) + (ch ^ 48);
42         ch = getchar();
43       }
44     return x * f;
45 }
46 //#define OJ
47 //#define debug
48 const int mod = 340610;
49 const int M = 1e5 + 1;
50 int a[M];
51 int ans = 1;
52 
53 signed main(){
54 #ifdef OJ
55 freopen(".in","r",stdin);
56 freopen(".out","w",stdout);
57 #endif
58 int n = read();
59 rep(i,1,n){
60     a[i] = read();
61 }
62 rep(i,2,n){
63      int x = a[i] - a[i - 1];
64      if(x > 2 || x < 0){
65          cout << 0 << endl;
66          return 0;
67      }
68      if(x == 0){
69          continue;
70      }
71      if(x == 1){
72          ans *= (i * 2 - 1 - 2 * a[i - 1]);
73          ans %= mod;
74      }
75      if(x == 2){
76          ans *= pow((i - 1 - a[i - 1]),2);
77          ans %= mod;
78          }
79 }
80 printf("%lld\n",ans % mod);
81 #ifdef debug
82     printf("\nTime used = %lf", (double)clock() / CLOCKS_PER_SEC);
83 #endif
84     return 0;
85 }

今天是2022.10.3

CSP 动力 ++

NOIP 动力 ++

We‘re ready for fighting int the night!

 

标签:orz,1.1,ybtoj,sto,矩阵,个数,include,我们,define
From: https://www.cnblogs.com/Eruption/p/16749991.html

相关文章

  • Download Music For Free (vision:1.1 Beta build 2022060201)
    音乐下载工具版本:1.1Betabuild2022060201源代码:'''本次更新内容:1.添加信息提示功能2.更改一些字的字体'''#导入模块fromtkinterimport*importrequestsi......
  • 代码随想录 哈希表理论基础,有效的字母异位词(LeetCode 242),两个数组的交集 (LeetCode
    哈希表理论基础哈希表是根据关键码的值而直接进行访问的数据结构。哈希碰撞拉链法拉链法就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会......
  • HCIP-Datacom-Core 1.1实验 OSPF单区域
    前言:哈哈,我这个鸽子王又回来了! 1.1.1实验介绍实现单区域OSPF的配置 实现OSPF区域认证的配置 描述OSPF在多路访问网络中邻居关系建立的过程 实现对OSPF接口......
  • 【C语言】给定两个数,求这两个数的最大公约数
    ​​intmain()​​​​{​​​​​intnum1=0;​​​​ intnum2=0;​​​​ inta=0;​​​​ scanf("%d%d",&num1,&num2);​​​​ while(a=num1%num2......
  • 完全背包个数问题,先背包和先物品的差别
    完全背包问题如果先遍历物品,则物品排序只会由小到大,比如{1,5},只会出现15而不会出现51,而先遍历被背包,会出现15和51,所以怎么遍历,要看题目要求。先遍历物品的例子:https://le......
  • 1.1 层叠
    CSSCSS,全面层叠样式表,(CascadingStylesSheet)CSS,是一种声明规则,即在我们规定的条件下产生各种各样的效果CSS声明css声明该声明由一个属性(color)和一个值(black)组成......
  • 1.11 Linux进程管理
    Linux进程管理在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。每个进......
  • Affinity Publisher for Mac(桌面排版神器)v1.10.5中文注册版
    你可能不知道,排版神器正式版AffinityPublisherforMac已经发布了!AffinityPublisherforMac中文注册版是创意软件工作室Serif旗下的一款桌面排版应用,可以帮助专业设计......
  • 在 nginx 中配置 HSTS 并禁用 TLS 1.0、1.1
    可以使用以下地址工具按需生成nginx配置https://ssl-config.mozilla.org/#server=nginxHSTS的配置为:#HSTS(ngx_http_headers_moduleisrequired)(63072000seco......
  • 1.1学生排名表(析构函数)
    现在输入一批学生(人数大于0且不超过100)的名次和他们的姓名。要求按名次输出每个人的排名。输入格式:每行为一个学生的信息,共两项,第一项为排名(为正整数,且任意两名学生的排名......