ZOJ 3690 Choosing number(矩阵)
Choosing number
【题目链接】Choosing number
【题目类型】矩阵
&题解:
这题就和已经dp极像了,所以找方程就很困难了.可以这样找:
设f(n)是前n-1个人已经完成,第n个人选>k,g(n)是前n-1个人已经完成,第n个人选<=k.
那么f(n)=f(n-1)*(m-k)+g(n-1)*(m-k)   g(n)=f(n-1)*k+g(n-1)*(k-1)
最后答案是f(n)+g(n)  所以这题难就难在想公式上
【时间复杂度】\(O(logn)\)
&代码:
#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int M= 1000000007;
ll n,m,k;
struct mat
{
	ll m[4][4];
}A;
mat Mul(mat a,mat b)
{
	mat c;
	for(int i=0;i<2;i++){
		for(int j=0;j<2;j++){
			c.m[i][j]=0;
			for(int k=0;k<2;k++){
				c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
			}
		}
	}
	return c;
}
mat bPow(mat a,ll z)
{
	mat un;
	for(int i=0;i<2;i++)for(int j=0;j<2;j++)
	un.m[i][j]=(i==j);
	while(z){
		if(z&1)
			un=Mul(un,a);
		a=Mul(a,a);
		z>>=1;
	}
	return un;
}
int tb[4];
void Init()
{
	tb[0]=m-k,tb[1]=k;
	A.m[0][0]=A.m[0][1]=m-k;
	A.m[1][0]=k,A.m[1][1]=k-1;
}
int main()
{
	freopen("E:1.txt","r",stdin);
	while(cin>>n>>m>>k){
		Init();
		A=bPow(A,n-1);
		ll ans=0;
		for(int i=0;i<2;i++)
		for(int j=0;j<2;j++){
			ans=(ans+A.m[i][j]*tb[j])%M;
		}
		cout<<ans<<endl;
	}
	return 0;
}
												
											ZOJ 3690 Choosing number(矩阵)的更多相关文章
- ZOJ 3690  Choosing number(dp矩阵优化)
		
Choosing number Time Limit: 2 Seconds Memory Limit: 65536 KB There are n people standing in a r ...
 - zoj   3690   Choosing number
		
题意 就是说给你 N 个人站成一排,现在每个人都可以选择 1-M 中间的任意一个数字,相邻的两个人数字相同,则他必须是是 > K 的 问方案总数: 方法 先求出递推式,然后用矩阵 ...
 - ZOJ 3690 & HDU 3658 (矩阵高速幂+公式递推)
		
ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...
 - Choosing number ZOJ - 3690 (矩阵快速幂)
		
题意:n个人站成一排,每个人任意从1——m中任意取一个数,要求相邻两个人的如果数字相同,数字要大于k. 分划思想推导表达式: 假设 i 个人时.第i个人的选择有两种一种是选择小于等于k的数,另一种 ...
 - ZOJ 3622 Magic Number 打表找规律
		
A - Magic Number Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Subm ...
 - ZOJ 3436 July Number(DFS)
		
题意 把一个数替换为这个数相邻数字差组成的数 知道这个数仅仅剩一位数 若最后的一位数是7 则称原来的数为 July Number 给你一个区间 求这个区间中July Number的个数 ...
 - ZOJ 3233 Lucky Number
		
Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
 - [ZOJ 3622] Magic Number
		
Magic Number Time Limit: 2 Seconds Memory Limit: 32768 KB A positive number y is called magic n ...
 - ZOJ 3622 Magic Number(数)
		
题意 假设一个正整数y满足 将随意正整数x放到y的左边得到的数z满足 z%y==0 那么这个数就是个Magic Number 给你一个范围 求这个范围内Magic Number的个数 令 ...
 
随机推荐
- [No0000104]JavaScript-基础课程4
			
要说 JavaScript 和其他较为常用的语言最大的不同是什么,那无疑就是 JavaScript 是函数式的语言,函数式语言的特点如下: 函数为第一等的元素,即人们常说的一等公民.就是说,在函数式编 ...
 - xcode工程编译错误:The maximum number of apps for free development profiles has been reached.
			
真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...
 - Flink – WindowedStream
			
在WindowedStream上可以执行,如reduce,aggregate,min,max等操作 关键是要理解windowOperator对KVState的运用,因为window是用它来存储wind ...
 - LeetCode 961 N-Repeated Element in Size 2N Array 解题报告
			
题目要求 In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is re ...
 - 《Redis 垃圾回收》
			
推荐一首歌 - <纸短情长> 花粥 很好听 一:redis的垃圾回收 - 为了可以使用更多的内存,redis有一套自己的键值淘汰机制. - 修改 maxmemory参数,限制Redis使用 ...
 - 谈谈javascript数组排序方法sort()的使用,重点介绍参数使用及内部机制?
			
语法:arrayObject.sort(sortby) 参数sortby可选,规定排序顺序,必须是函数: 注:如果调用该方法时没有使用参数,将按字符编码的顺序进行排序,要实现这一点,首先应把数组的元素 ...
 - html多文件上传,可支持预览
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Spring 注解 @Scheduled(cron = "0 0/10 * * * ? ") 动态改变时间
			
import java.util.Date; import java.util.concurrent.Executor; import java.util.concurrent.Executors; ...
 - Got timeout reading communication packets解决方法
			
Got timeout reading communication packets解决方法 http://www.th7.cn/db/mysql/201702/225243.shtml [Note] ...
 - 004-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-共享服务中心建设原则
			
一般来说服务能力包括两个层次,一个是底层paas的能力,PaaS层结局大型架构在分布式.可靠性.可用性.容错.监控以及运维层面上的通用需求:第二个层次是业务能力,业务能力提供云化的核心业务支撑能力,这 ...