Permutations

Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

给出两个正整数N、K,问存在多少个长度为N的排列,满足其峰顶数目为K。所谓排列就是有一个序列a[1] ...a[N],每个数均不相同,且都是1

<= a[i] <= N,a[i]是峰顶的意思是 a[i] > a[i - 1] && a[i] > a[i + 1],对于边界,我们假设a[0] = -1000000000 和 a[N +

1] = -1000000000

Input

多组数据,每组数据一行,N,K(1 <= N <= 10^18, 1 <= K <= 30)

Output

每组数据一行,你的答案 % 239

Sample Input

5 1
5 2
3 1
10 3

Sample Output

16
88
4
131

Hint

比如对于排列1 3 2 4 5,a[2] = 3和a[5] = 5都是峰顶,因此这个排列峰顶数目为2
 
 
 #include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
#define ll long long
#define MAX 32
#define mod 239
struct matrix
{
int a[MAX][MAX];
} origin,res,anss,ansa;
matrix multiply(matrix x,matrix y)
{
matrix temp;
memset(temp.a,,sizeof(temp.a));
int i,j,k;
for(k=; k<MAX; k++)
for(i=; i<MAX; i++)
if(x.a[i][k])
for(j=; j<MAX; j++)
temp.a[i][j]+=x.a[i][k]*y.a[k][j]%mod,temp.a[i][j]%mod;
return temp;
}
void calc(ll x)
{
memset(res.a,,sizeof(res.a));
int i;
for(i=; i<MAX; i++)
res.a[i][i]=;
while(x)
{
if(x&)
res=multiply(res,origin);
origin=multiply(origin,origin);
x>>=;
}
}
void init(int x)
{
memset(origin.a,,sizeof(origin.a));
int i,j;
for(i=; i<MAX; i++)
{
j=i-;
origin.a[i][i]=*i;
origin.a[i][j]=(x-*j)%mod;
}
}
int dp[][]= {},ans;
void init1()
{
int i,j;
dp[][]=;
for(i=; i<; i++)
for(j=; j<i; j++)
dp[i][j]=((dp[i-][j]**j)%mod+(dp[i-][j-]*max(,i-*j+))%mod)%mod;
}
int main()
{
init1();
ll n,k,i,m,j,kk;
while(~scanf("%lld%lld",&n,&k))
{
if(n<)
{
printf("%d\n",dp[n][k]);
continue;
}
n-=;
ans=;
memset(anss.a,,sizeof(anss.a));
for(i=; i<MAX; i++)anss.a[i][i]=;
for(kk=; kk<; kk++)
{
init(kk);
anss=multiply(origin,anss);
if((n%)==(kk%))
{
for(i=; i<MAX; i++)
for(j=; j<MAX; j++)
ansa.a[i][j]=anss.a[i][j];
}
}
n/=;
if(n)
{
for(i=; i<MAX; i++)
for(j=; j<MAX; j++)
origin.a[i][j]=anss.a[i][j];
calc(n);
ansa=multiply(ansa,res);
}
for(j=; j<MAX; j++)
{
ans+=(dp[][j]*ansa.a[k][j])%mod;
ans%=mod;
}
printf("%d\n",ans);
}
}

Permutations 好题的更多相关文章

  1. LightOJ 1023 Discovering Permutations 水题

    http://www.lightoj.com/volume_showproblem.php?problem=1023 题意:26字母全排列 思路:用next_permutation或者思维想一下都可以 ...

  2. POJ 2470 Ambiguous permutations(简单题 理解题意)

    [题目简述]:事实上就是依据题目描写叙述:A permutation of the integers 1 to n is an ordering of these integers. So the n ...

  3. leetcode -- Permutations II TODO

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  4. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  5. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  6. [Codeforces Educational Round 71]Div. 2

    总结 手速场...像我这种没手速的就直接炸了... 辣鸡 E 题交互,少打了个 ? 调了半个小时... 到最后没时间 G 题题都没看就结束了...结果早上起来被告知是阿狸的打字机...看了看题一毛一样 ...

  7. lintcode 中等题:permutations II 重复数据的全排列

    题目 带重复元素的排列 给出一个具有重复数字的列表,找出列表所有不同的排列. 样例 给出列表 [1,2,2],不同的排列有: [ [1,2,2], [2,1,2], [2,2,1] ] 挑战 使用递归 ...

  8. lintcode 中等题:permutations 全排列

    题目 全排列 给定一个数字列表,返回其所有可能的排列. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个列表[1,2,3],其全排列为: [ [1,2,3], [1,3,2], [2,1,3 ...

  9. LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2

    题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...

随机推荐

  1. linux ls 命令

    ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...

  2. HK2使用详解

    HK2介绍 组件 生命周期 定义服务 注入服务 HK2介绍 HK2是一个轻量级动态依赖注入框架,它是JSR-330的实现. 组件 在HK2组件模型中,一个组件的功能是通过服务接口-服务实现的模式声明的 ...

  3. C#多线程的用法7-线程间的协作ManualResetEvent

    ManualResetEvent:手动重置事件,它用于线程间同步时用法非常简单也易于理解. private static void MultiThreadSynergicWithManualReset ...

  4. chrome保持元素hover,active状态

    审查元素,选中需要hover的标签 点击"Styles"菜单中的":hov",弹出 Force element state 选中相应的 :hover :acti ...

  5. 浅谈java中==与equals的区别

    今天做了一个业务模块,需要简单的遍历比较值,所以习惯性的用了 "==" ,但是结果没有达到预想的结果是什么鬼? 看到这里,有人一定会指出这俩货不是基本变量! "关系操作符 ...

  6. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...

  7. 全面解析for循环

    牛刀小试: for(var i = 0 ; i < 100; i++) {console.log(i);} var i = 0;//第一个代码段 i < 100; //第二个代码段 i++ ...

  8. Java学习10——package和import

    package和import语句 为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间,使用时,import引入相应package ...

  9. 201521123024《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 注意conve ...

  10. 201521123055 《Java程序设计》第7周学习总结

    1. 本章学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源代码 1.3 结合1.1 ...