摘要:
/*
s[i][j]表示i秒钟后第j个灯的情况
s[i][j] = (s[i-1][j] + s[i-1][j-1]) % 2;
令
Fn(1,len) = |s[i][0] s[i][1] …… s[i][len]|
F0(1,len)为输入状态
A(len len) = |1 1 | | 1 1 | | …… | |1 1|
Fn = F0 * A ^ n
这题中模板会超时,要把模板中Multiply()的%放到()外面才可以
*/
#include "Mat.h"
#include <iostream>
usin... 阅读全文
摘要:
/*
由f(n)=f(n-1)+f(n-2)构造矩阵
令
Fn(1,2) = |f(n) f(n-1)|
A(2 2) = |1 1| |1 0|
F1(1 2) = |1 0|
Fn = F(n-1) * A = F1 * A ^ (n-1)
代入n = g(i) = k * i + b 得:Fn = F1 * A ^ (k * i + b - 1)
1)b > 1
Fn = F1 * A^(b-1) * (A^k)^i
Sum(Fn) = F1 * A^(b-1) * Sum((A^k)^i)
2)b = 1
Fn = F1 * (A^k)^i
Sum(Fn) = F1 * Sum( 阅读全文
摘要:
//最原始的矩阵应用,不解释
#include "Mat.h"
#include <iostream>
#include<map>
#include<string>
using namespace std; map<string, int> M;
Mat mat, temp1, temp2;
int main()
{ int n, cnt, k, t1, t2, ans, a1, a2; string p1, p2, v1, v2; mod = 2008; while(cin>>n) { mat.clear(); 阅读全文
摘要:
//1160
#include <iostream>
#include <algorithm>
using namespace std; struct mouse
{ int id; int weight; int speed; int pos; int pre;
}s[10005];
bool cmp(mouse a,mouse b)
{ return(a.weight<b.weight||(a.weight==b.weight&&a.speed<b.speed));
} int main()
{ int count=0; while(sc 阅读全文
摘要:
解题思路: 这个题目直接求合理的排序比较烦琐,采用模拟的方法也显然不行。可以先考虑可以实现的概率,再用实际的总次数去乘。 先把所有的n个拿50的人排好,接下来再把拿100的人插入队列。求可行的概率。 n个拿50的人有n+1个空位,除了第一个以外,其他的位置都可以,所以概率是n/n+1,在以上的基础下,第2个的的概率是n-1/n(由于是求概率,所以可以把所有的拿50或100的人看成是一样的,在这个前提下可以认为第一个拿50的人和第一个拿100的人一起消失了。为什么可以这么认为?由于在求概率,不去除的化会重复计算,具体读者自己思考)。同理直到最后一个拿100的插入队列,他成功的概率是n-m+... 阅读全文
摘要:
//hdu1134大数+catalan数
#include<iostream> #include<string> #include<iomanip> #include<algorithm> using namespace std; #define MAXN 9999
#define DLEN 4 class BigNum{ private: int a[300]; int len; public: BigNum(){len = 1;memset(a,0,sizeof(a));} BigNum(const int b); ... 阅读全文
摘要:
/*设d[k]是重量为k时所对应的最小价值,重量不可能凑成k时,置其为-1,表示无穷大状态转移方程:dp[k] = 0…………k = 0;dp[k] = min(value[j] + dp[k - weight[j]])…………k >= weight[j];其中,1=< j <= n,若dp[k - weight[j]]) = -1,表示它是无穷大,重量不能达到本题求的是最小,模板需要做一些细微的改动/*完全背包
有N种物品和一个容量为V的背包,每种物品都有无限件可用。
第i种物品的费用是c[i],价值是w[i]。
令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大 阅读全文