传送门

https://www.cnblogs.com/violet-acmer/p/10201535.html

 

题意:

  求 n 的所有全排列组成的序列中连续的 n 个数加和为 n*(n+1)/2 的区间个数。

题解:

  n 最大为1e6,而n的全排列个数为 n! ,一共有 n*n!个数,存都存不下啊......

  然后,第一反应就是,这题是找规律的。

  一言不合就打表 

  ==========
  i=1
  1
  ==========
  i=2
  2
  ==========
  i=3
  9
  ==========
  i=4
  56
  ==========
  i=5
  395
  ==========
  i=6
  3084
  ==========
  i=7
  26621

  起初,想到了数 n 有 n! 个全排列,那么,这 n! 个全排列肯定满足条件,那么剩下的情况呢?

  i=3 : 9=3!+3...........................3=3*1=3*(2-1);

  i=4 : 56=4!+32.......................32=4*8=4*(9-1);

  i=5 : 395=5!+275 ..................275=5*55=5*(56-1);

  仔细观察一下括号中的2,9,56,相信这个规律很好找吧..........

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define ll __int64
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 const ll MOD=998244353;
 9 const int maxn=1e6+10;
10 
11 int n;
12 ll a[maxn];
13 
14 int main()
15 {
16     cin>>n;
17     a[1]=1;
18     ll fact=1;//阶乘
19     for(int i=2;i <= n;++i)
20     {
21         fact=fact*i%MOD;
22         a[i]=fact+i*(a[i-1]-1);
23         a[i] %= MOD;
24     }
25     cout<<a[n]<<endl;
26 }
View Code

相关文章:

  • 2022-12-23
  • 2021-12-29
  • 2021-05-24
  • 2021-09-25
  • 2021-08-17
  • 2021-06-21
  • 2021-12-30
  • 2022-12-23
猜你喜欢
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-31
  • 2021-11-23
  • 2021-09-13
相关资源
相似解决方案