ZOJ 2619: Generator
类型:概率 + 解方程组(高斯消元法) + KMP(好吧其实我用的是暴力~)
题意:你可以等概率的选择大写字母里的前n个字母,在纸上写啊写,一直到出现给定的字符串。问写的字母个数的期望。
思路:
期望递推法。(不过这里推出了个环……)
下一个状态是看现在这个串,加上一个字母之后,能匹配到原串的哪里。(就是KMP里面的失配数组,写字符串的过程,就是一边写一边匹配)
不过我KMP不太熟悉,就直接暴力了。。
推完后发现,推出了一个环。怎么办,只能用高斯消元法来解这个方程组了。
这题比较特殊,经过证明(我不会= =)可以得到,答案必定为整数。
高斯消元法用double精度卡死(样例都过不了),用分数还是WA(可能溢出了),最后纯用long long 终于过了它。。。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; char str[];
char tmpstr[]; long long matrix[][]; int check() {
int res = ;
for (int i = ; tmpstr[i]; i++) {
bool ok = true;
for (int j = ; tmpstr[j+i]; j++) {
if (str[j] != tmpstr[j+i]) {
ok = false;
break;
}
}
if (ok) {
res = strlen(tmpstr) - i;
break;
}
}
return res;
} bool gauss(int row, int col) {
for (int i = ; i < row; i++) {
int k = -;
for (int j = i; j < row; j++) {
if (matrix[j][i] != ) {
k = j;
break;
}
}
if (k == -) return false;
for (int j = ; j < col; j++) {
swap(matrix[i][j],matrix[k][j]);
}
if (matrix[i][i] < ) {
for (int j = ; j < col; j++) {
matrix[i][j] *= -;
}
}
for (int j = ; j < row; j++) {
if (j == i) continue;
if (matrix[j][i] == ) continue;
if (matrix[j][i] < ) {
for (int k = ; k < col; k++) {
matrix[j][k] *= -;
}
}
long long gcdnum = __gcd(matrix[i][i], matrix[j][i]);
long long lcanum = matrix[i][i]/gcdnum*matrix[j][i];
long long jmul = lcanum / matrix[j][i];
long long imul = lcanum / matrix[i][i];
for (int k = ; k < col; k++) {
matrix[j][k] = matrix[j][k]*jmul - matrix[i][k] * imul;
}
}
}
return true;
} void print(int len) {
puts("--------");
for (int i = ; i < len; i++) {
for (int j = ; j < len+; j++) {
printf("%lld ", matrix[i][j]);
}puts("");
}
} int main() {
int t;
scanf("%d", &t);
for (int cas = ; cas <= t; cas++) {
if (cas != ) puts("");
printf("Case %d:\n", cas); int n;
scanf("%d%s", &n, str);
int len = strlen(str); //计算dp[0]~dp[len-1] len条方程
for (int i = ; i < len; i++) {
for (int j = ; j < len+; j++) matrix[i][j] = ;
matrix[i][i] = -n;
matrix[i][len] = -n;
sprintf(tmpstr, "%s", str);
tmpstr[i+] = ;
for (int j = ; j < n; j++) {
tmpstr[i] = 'A'+j;
if (check() != len) matrix[i][check()]++;
}
}
//print(len);
if (!gauss(len, len+)) puts("ERROR");
//print(len);
//printf("%lld(%lld/%lld)\n", matrix[0][len]/matrix[0][0], matrix[0][len], matrix[0][0]);
printf("%lld\n", matrix[][len]/matrix[][]);
}
return ;
}
ZOJ 2619: Generator的更多相关文章
- JavaScript异步编程:Generator与Async
从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱. Promise是下边要讲的Generator/yield与async/await的基 ...
- ES6新特性三: Generator(生成器)函数详解
本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...
- ES6 异步编程之一:Generator
Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...
- ES6 - Note7:Generator函数
Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...
- Python:generator的send()方法流程分析
先来一个简单地例子: def foo(): print('starting') while True: r = yield 2 print(r) f = foo() print(f.send(None ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- django1.11 启动错误:Generator expression must be parenthesized
错误信息: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0 ...
- ES6入门十一:Generator生成器、async+await、Promisify
生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...
- django 启动错误:Generator expression must be parenthesized 错误信息:
错误为: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x ...
随机推荐
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Struts2和SpringMVC简单配置以及区别总结
Struts2: struts 2 是一个基于MVC(mode-view-con)设计模式的Web应用框架,是由Struts1和WebWork两个经典框架发展而来的. 工作流程: 1客户端浏览器发出H ...
- 04Windows中的字符类型
1. Windows 中常用的数据类型定义 //WinNt.h中定义 typedef unsigned short wchar_t; //A 16-bit character typedef char ...
- Django小总结
初始Git git init 初始化本地仓库,会在根目录下创建一个.git文件夹 git log 查看提交日志 git status 查看日志 git add 文件名 添加到缓存区 git commi ...
- Leetcode(204) Count Primes
题目 Description: Count the number of prime numbers less than a non-negative number, n. Credits: Speci ...
- nRF52-PCA10040——Overview
Overview Zephyr applications use the nrf52_pca10040 board configuration to run on the nRF52 Developm ...
- CentOS 7 安装 配置 Nginx + PHP
. CentOS 7 下配置 yum 安装 Nginx. 进入/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo: cd /etc/yum.repos.d/ vim ngi ...
- Solution: 最近公共祖先·一 [hiho一下 第十三周]
题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中 ...
- java静态代理模式
代理模式分为动态代理和静态代理. 静态代理简述: 1.为其他对象提供一种代理,以控制对这个对象的访问. 2.代理对象会起到中介的作用,可以增加些功能,也可以去掉某些功能. 静态代理: 代理和被代理对象 ...
- MyBatis多个接口参数报错:Available parameters are [0, 1, param1, param2], 及解决方法
1. sql语句如下: SELECT * FROM tb_crm_user WHERE id = #{userId, jdbcType=INTEGER} AND user_name = #{userN ...