zoukankan      html  css  js  c++  java
  • Good Bye 2018 D. New Year and the Permutation Concatenation

    传送门

    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

    打表找规律代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=1e6;
     6 
     7 int p[maxn];
     8 int b[maxn];
     9 
    10 int main()
    11 {
    12     for(int i=1;i <= 6;++i)
    13     {
    14         for(int j=0;j < i;++j)
    15             b[j]=j+1;
    16 
    17         int index=1;
    18         do
    19         {
    20             for(int j=0;j < i;++j)
    21                 p[index++]=b[j];
    22         }while(next_permutation(b,b+i));
    23         int res=0;
    24         for(int j=1;j+i <= index;++j)
    25         {
    26             int sum=0;
    27             for(int k=j;k < j+i;++k)
    28                 sum += p[k];
    29 
    30             if(sum == i*(i+1)/2)
    31                 res++;
    32         }
    33         printf("==========
    i=%d
    ",i);
    34         printf("%d
    ",res);
    35     }
    36 }
    View Code

      用到了一个骚操作:next_permutation();

      爽歪歪,哈哈哈

  • 相关阅读:
    jquery.datatables中文使用说明
    jquery.datatables中文语言设置
    .net c# 视频剪切抓取缩略图
    Firefox os初体验
    maven 管理项目实践指南
    HTML5本地存储之Database Storage篇
    推荐开源软件
    HTML5实现网页元素的拖放操作
    分布式环境下基于redis解决在线客服坐席动态分配的问题
    HTML5本地存储之Web Storage篇
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/10201736.html
Copyright © 2011-2022 走看看