Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation
https://codeforces.com/contest/1091/problem/D
题目:
Let n be an integer. Consider all permutations on integers 1 to n in lexicographic order, and concatenate them into one big sequence p. For example, if n=3, then p=[1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1]. The length of this sequence will be n⋅n!n⋅n!.
Let 1≤i≤j≤n⋅n!be a pair of indices. We call the sequence (pi,pi+1,…,pj−1,pj) a subarray of pp. Its length is defined as the number of its elements, i.e., j−i+1. Its sum is the sum of all its elements, i.e., ∑jk=ipk.
You are given n. Find the number of subarrays of p of length n having sum n(n+1)/2. Since this number may be large, output it modulo 998244353 (a prime number).
Input
The only line contains one integer n (1≤n≤106), as described in the problem statement.
Output
Output a single integer — the number of subarrays of length nn having sum n(n+1)/2, modulo 998244353.
Examples
Input1
3
Output1
9
Input2
4
Output2
56
Input3
10
Output3
30052700
Note
In the first sample, there are 16 subarrays of length 3. In order of appearance, they are:
[1,2,3], [2,3,1], [3,1,3], [1,3,2], [3,2,2] [2,2,1], [2,1,3], [1,3,2], [3,2,3], [2,3,1], [3,1,3], [1,3,1], [3,1,2], [1,2,3], [2,3,2], [3,2,1].
Their sums are 6, 6, 7, 6, 7, 5, 6, 6, 8, 6, 7, 5, 6, 6, 7, 6. As n(n+1)/2=6, the answer is 9.
分析:
这道题题意挺明确的,输入一个n,然后把长度为n,初始值为1的连续递增的数列进行全排列然后排在一块,再找其中连续的n个数,要求这n个数必须是1-n。
题意就是这样那么就分析:
暴力,呵呵呵呵,祝你好运
看到只输入一个数n,第一反应就是oeis

无果,遂自寻规律
此处应该有规律
~10是
当然这个在一开始做的时候是绝对绝对不知道的
于是手推
推大概n=5的时候395还没有太大的问题,分成第一个数字是12345可以分成五份,然后用全排列打个小程序,看看规律
首先一个很显然的事实:
当全排列第一个数字是1和全排列第一个数字是2的凑在一块,是肯定无法实现1-n的排列的
所以我们可以把整体分为n份,此为第一个结论
然后分析每一块
先以n=3开始
全排列是
123132
显然123 132 是两个,也就是组成这个大数列P的是肯定必须都满足条件
然后就是231,此为第一个全排列的第二个数开始,这是重中之重
第二个全排列的第二个数后面没有后继的数,遂作罢
当n=4时,
1234 1243 1324 1342 1423 1432
首先显然的是6个
其次就是每个全排列的第二个数和后面的n-1个数组成的都是成立的
这些是5个
然后每个全排列的第三个数开始的长度为n的数列成立的是3个
这时候可能会有一丝丝思路,但不明确
当n=5的时候
写出来有点小多啊。。。。
那就用程序跑
截取我输出的结果
首先的24个是跑不了
然后接下来的23也跑不了
再往下看,,就有些神奇了
此时应该关注每个全排列的第三个数
第三个数和第四第五个数,用竖着看的方式,会发现当前两个数固定,就是后面在进行全排列!(废话这是全排列的性质)
那么我们可以分析出来这24个中,5个成立的,1个不成立的,5个成立的,1个不成立的
咦居然有周期
试试第四个数
1,1,1,1,1
也就是成立和不成立交叉着
那么和第四个数相匹配,那是什么?
23+1 = 24
5+1 = 6
1+1 = 2
这不就是阶乘吗!
然后再用心钻研那么一点点
((n-1)!+(n-1)!*((n-2)!-1)/(n-2)!+(n-1)!*((n-3)!-1)/(n-3)!···)*n
讲真这里还不如自己手写一下然后看代码
对了除法取模要用逆元
这道题你要说不会做以后遇到怎么办,我只能说多练数学题,培养对数学的感觉,就是这样
AC代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <time.h>
#include <queue>
#include <string.h>
#define sf scanf
#define pf printf
#define lf double
#define ll long long
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define p(n) printf("%d",n);
#define pln(n) printf("%d\n",n);
#define s(n) scanf("%d",&n);
#define ss(n) scanf("%s",n);
#define ps(n) printf("%s",n);
#define sld(n) scanf("%lld",&n);
#define pld(n) printf("%lld",n);
#define slf(n) scanf("%lf",&n);
#define plf(n) printf("%lf",n);
#define sc(n) scanf("%c",&n);
#define pc(n) printf("%c",n);
#define gc getchar();
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define LL long long
#define eps 1e-6
using namespace std;
const ll mod = ;
ll pow_quick(ll a,ll b){
ll r = ,base = a;
while(b){
if(b & ){
r *= base;
r %= mod;
}
base *= base;
base %= mod;
b >>= ;
}
return r;
} ll a[];
int main() {
ll n;
sld(n)
if(n == ){
p() pn return ;
}
a[] = 1ll;
for(ll i = ; i <= n; i ++){
a[i] = a[i-]*i;
a[i] %= mod;
}
ll sum = a[n-];
//pld(sum) pn
for(ll i = ; i <= n; i ++){
ll x = (a[n-]*pow_quick(a[i-],mod-))%mod;
x *= a[i-]-;
x %=mod;
sum += x;
sum %= mod;
}
pld((sum*(n))%mod) pn
return ;
}
代码链接:https://codeforces.com/contest/1091/submission/47758982
Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B的更多相关文章
- Codeforces D. Little Elephant and Interval(思维找规律数位dp)
题目描述: Little Elephant and Interval time limit per test 2 seconds memory limit per test 256 megabytes ...
- Codeforces Good Bye 2018 D (1091D) New Year and the Permutation Concatenation
题意:给n!个n的排列,按字典序从小到大连成一条序列,例如3的情况为:[1,2,3, 1,3,2, 2,1,3 ,2,3,1 ,3,1,2 ,3,2,1],问其中长度为n,且和为sum=n*(n+1) ...
- Codeforces Round #347 (Div. 2) C. International Olympiad 找规律
题目链接: http://codeforces.com/contest/664/problem/C 题解: 这题最关键的规律在于一位的有1989-1998(9-8),两位的有1999-2098(99- ...
- Codeforces Round #327 (Div. 2) C. Median Smoothing 找规律
C. Median Smoothing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/p ...
- codeforces#1136 C. Nastya Is Transposing Matrices(找规律)
题意:给出两个n*m的矩阵,每次操作可以让一个正方形矩阵行列交换.问,在无限次操作下,第一个矩阵能否变成第二个矩阵 分析:先把操作限定在2*2的矩阵中.这样对角线上的元素就可以随意交换.也就是说,如果 ...
- codeforces D. Queue 找规律+递推
题目链接: http://codeforces.com/problemset/problem/353/D?mobile=true H. Queue time limit per test 1 seco ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- Codeforces Gym 100114 A. Hanoi tower 找规律
A. Hanoi tower Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descript ...
- Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)
题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...
随机推荐
- 创建第一个vue实例
一.vue安装与下载 1. 官网下载 下载地址 选择开发版本 2. 打开sublime,新建vue文件夹,将下载好的代码vue.js放入vue文件夹中. 3. 新建index.html文件,在hea ...
- SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
死锁概述 对于数据库中出现的死锁,通俗地解释就是:不同Session(会话)持有一部分资源,并且同时相互排他性地申请对方持有的资源,然后双方都得不到自己想要的资源,从而造成的一种僵持的现象.当然,在任 ...
- tensorflow object detection api graph rewriter
目前,tensorflow 目标识别的api函数可以使用 graph rewriter这样的配置,这样配置的引入主要是为了模型压缩使用,具体设置参数有: syntax = "proto2&q ...
- kvm动态添加硬盘
1.创建硬盘. qemu-img create -f qcow2 /data/data_root/vm-images/xxxx.qcow2 20G 2.添加硬盘 方式1.动态添加: virsh att ...
- LVM XFS增加硬盘分区容量最后一步的时候动态扩容报错
在我们lvextend扩容完之后,想动态扩容时出现错误.我们可以用以下命令来进行操作. 若不是xfs我们可以用resize2fs,这里报错了 [root@Mysql01-213-66 ~]# resi ...
- cordova/ionic打包流程
ionic android 手工打包指令手册 [工作平台要求] 安装 node.js.cordova.ionic(非必须) 等前端相关软件与组件(1)安装 Java-SDK,正确配置系统环境变量 JA ...
- 查询sqlserver数据库表的记录数
SELECT a.name, b.rows FROM sysobjects AS a INNER JOINsysindexes AS b ON a.id = b.idWHERE (a.type = ' ...
- Spring常用注解总结(2)
@Autowired "自动填装",作用是为了消除代码JAVA代码里面的getter/setter与bean属性中的property. @Autowired默认按类型匹配的方式,在 ...
- 分布式系统-主键唯一id,订单编号生成-雪花算法-SnowFlake
分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作 ...
- stm32-arduino-f103
希望给工作中偶尔要用的一些辅助板卡(例如运行信息现场记录)找一个快速开发的手段,Arduino作为流行的开源嵌入硬件框架,组件丰富,资料众多,所以想以Arduino作为平台.但是Arduino板子基本 ...