“玲珑杯”ACM比赛 Round #12 (D) 【矩阵快速幂的时间优化】
//首先,感谢Q巨
定义状态向量b[6]
b[0]:三面临红色的蓝色三角形个数
b[1]:两面临红色且一面临空的蓝色三角形个数
b[2]:一面临红色且两面临空的蓝色三角形个数
b[3]:三面临红色的黄色三角形个数
b[4]:两面临红色且一面临绿+的黄色三角形个数
b[5]:一面临红色且两面临绿+的黄色三角形个数
转移矩阵:
[3 1 0 0 0 0;
0 2 2 0 0 0;
0 1 3 0 0 0;
3 2 1 0 0 0;
0 0 0 6 3 0;
0 0 0 0 2 4]
最朴素的TLE代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; ; LL b[N]= {,,,,,}; //此处初始化列向量 LL hh[N][N]={{,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,} }; struct Mat { LL mat[N][N]; } A; Mat Mut(Mat a,Mat b) { Mat c; memset(c.mat,,sizeof(c.mat)); ; k<N; k++) ; i<N; i++) if(a.mat[i][k]) ; j<N; j++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%mod; c.mat[i][j]=c.mat[i][j]%mod; } return c; } Mat Qpow(Mat a,LL n) { Mat c; ; i<N; ++i) ; j<N; ++j) c.mat[i][j]=(i==j); ) { ) c=Mut(c,a); a=Mut(a,a); } return c; } void cal(Mat A,LL n,LL b[],LL& Fn,LL& Gn) { Mat A_=Qpow(A,n-); Fn=Gn=; LL c[N]={}; ;i<N;i++) ;j<N;j++) c[i]=(c[i]+A_.mat[i][j]*b[j])%mod; Fn=(c[]+c[]+c[])%mod; Gn=(c[]+c[]+c[])%mod; } void init_A() { ;i<N;i++) ;j<N;j++) A.mat[i][j]=hh[i][j]; } int main() { LL n,Fn,Gn; init_A(); while(cin>>n) { ) { puts("1 0"); continue; } n--; cal(A,n,b,Fn,Gn); cout<<Fn<<' '<<Gn<<endl; } }
貌似(只是貌似)被优化但仍然TLE的代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; ; LL b[N]= {,,,,,}; //此处初始化列向量 LL hh[N][N]={{,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,} }; struct Mat { LL mat[N][N]; } A,F[]; void printM(Mat x) { puts("================================================================="); ;i<N;i++) { ;j<N;j++) printf("%10lld",x.mat[i][j]); puts(""); } } Mat Mut(Mat a,Mat b) { Mat c; memset(c.mat,,sizeof(c.mat)); ; k<N; k++) ; i<N; i++) if(a.mat[i][k]) ; j<N; j++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%mod; c.mat[i][j]=c.mat[i][j]%mod; } return c; } Mat Qpow(Mat a,LL n) { Mat c; ; i<N; ++i) ; j<N; ++j) c.mat[i][j]=(i==j); ) { ) c=Mut(c,a); a=Mut(a,a); } return c; } void cal(Mat A,LL n,LL b[],LL& Fn,LL& Gn) { Mat A_; ; i<N; ++i) ; j<N; ++j) A_.mat[i][j]=(i==j); ;i<&&n;i++,n>>=) ) A_=Mut(A_,F[i]); //printM(A_); Fn=Gn=; LL c[N]={}; ;i<N;i++) ;j<N;j++) c[i]=(c[i]+A_.mat[i][j]*b[j])%mod; Fn=(c[]+c[]+c[])%mod; Gn=(c[]+c[]+c[])%mod; } void init_A() { ;i<N;i++) ;j<N;j++) A.mat[i][j]=hh[i][j]; F[]=A; ;i<;i++) F[i]=Mut(F[i-],F[i-]); } int main() { LL n,Fn,Gn; init_A(); int T; // cin>>T; scanf("%lld",&T); while(T--) { // cin>>n; scanf("%lld",&n); ) { puts("1 0"); continue; } n-=; cal(A,n,b,Fn,Gn); // cout<<Fn<<' '<<Gn<<endl; printf("%lld %lld\n",Fn,Gn); } }
矩阵相乘一次的复杂度是O(N^3)的,不过预处理2^i(i:0~60)的矩阵后,可以用向量记录中间结果,而矩阵*向量的复杂度为O(N^2)
最终复杂度: O(T * lb(n) * N^2)->O(1e5 * 60 * 36)->O(2e8)
最终可以AC的代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; ; ; LL b[N]= {,,,,,}; //此处初始化列向量 LL hh[N][N]={{,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,}, {,,,,,} }; struct Mat { LL mat[N][N]; } A,F[]; void printM(Mat x) { puts("================================================================="); ;i<N;i++) { ;j<N;j++) printf("%10lld",x.mat[i][j]); puts(""); } } Mat Mut(Mat a,Mat b) { Mat c; memset(c.mat,,sizeof(c.mat)); ; k<N; k++) ; i<N; i++) if(a.mat[i][k]) ; j<N; j++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%mod; c.mat[i][j]=c.mat[i][j]%mod; } return c; } Mat Qpow(Mat a,LL n) { Mat c; ; i<N; ++i) ; j<N; ++j) c.mat[i][j]=(i==j); ) { ) c=Mut(c,a); a=Mut(a,a); } return c; } void cal(Mat A,LL n,LL b[],LL& Fn,LL& Gn) { Mat A_; LL c[N]={,,,,,}; ; i<N; ++i) ; j<N; ++j) A_.mat[i][j]=(i==j); ;i<&&n;i++,n>>=) ) { LL tres[]={,,,,,}; ;j<;j++) //矩阵的行 ;k<;k++) //矩阵的列 tres[j]=(tres[j]+F[i].mat[j][k]*c[k])%mod; ;j<;j++) c[j]=tres[j]%mod; } Fn=Gn=; Fn=(c[]+c[]+c[])%mod; Gn=(c[]+c[]+c[])%mod; } void init_A() { ;i<N;i++) ;j<N;j++) A.mat[i][j]=hh[i][j]; F[]=A; ;i<;i++) F[i]=Mut(F[i-],F[i-]); } int main() { LL n,Fn,Gn; init_A(); int T; scanf("%lld",&T); while(T--) { scanf("%lld",&n); ) { puts("1 0"); continue; } n-=; cal(A,n,b,Fn,Gn); printf("%lld %lld\n",Fn,Gn); } }
“玲珑杯”ACM比赛 Round #12 (D) 【矩阵快速幂的时间优化】的更多相关文章
- “玲珑杯”ACM比赛 Round #12题解&源码
我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧! A ...
- “玲珑杯”ACM比赛 Round #18
“玲珑杯”ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time ...
- “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】
A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT ...
- “玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)
“玲珑杯”ACM比赛 Round #19 Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-0 ...
- “玲珑杯”ACM比赛 Round #1
Start Time:2016-08-20 13:00:00 End Time:2016-08-20 18:00:00 Refresh Time:2017-11-12 19:51:52 Public ...
- SCUT - 12 - 西方国家 - 矩阵快速幂
https://scut.online/p/12 可以用矩阵快速幂来做. #include<bits/stdc++.h> using namespace std; typedef long ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- “玲珑杯”ACM比赛 Round #13 题解&源码
A 题目链接:http://www.ifrog.cc/acm/problem/1111 分析:容易发现本题就是排序不等式, 将A数组与B数组分别排序之后, 答案即N∑i=1Ai×Bi 此题有坑,反正据 ...
- POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13488 Accepted: ...
随机推荐
- 互联网“剁手”新方向,VR全景购物忙——全景智慧城市常诚
随着VR和AR技术的兴起,各行各业都在寻求VR+的对接方式,除了游戏和社交平台,另一大对VR有着浓厚兴趣的就是电商平台了,阿里.京东等电商巨头纷纷成立VR事业部,如何让亿万用户在VR中愉快的买买买,已 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 详解npm的模块安装机制 --社会我npm哥,好用话不多
依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm) 在一个npm项目下 ...
- oracle 体系结构简介
1.1.SGA(system global area) SGA是oracle Instance的基本组成部分,在示例启动是分配.是一组包含一个oracle实例的数据和控制信息的共享内存结构.主要用于存 ...
- python基础之数据类型/字符串/元组/列表/字典
Python 数据类型 数字类型: int整型,long 长整型(在python3.0里不区分整型和长整型).float浮点型:complex复数(python中存在小数字池:-5--257):布尔值 ...
- 如何解决wamp中数据库读取数据是???的情况?
数据库中数据正常,但是从数据库读取出的数据在网页中显示时是???,该怎么办呢? 左键点击托盘区的WampServer图标,选择Mysql--my.ini,就会打开配置文件 1.在[client]段落增 ...
- Hibernate_Validator学习分享
1. Hibernate Validator介绍 1.1 背景 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从 ...
- docker 汇总
整理中 ... 一. docker 基础 配置参数最佳实践 二. docker 编排工具 docker swarm mesos kubernetes AWS ECS 三. docker 生态 dock ...
- python+NLTK 自然语言学习处理二:文本
在前面讲nltk安装的时候,我们下载了很多的文本.总共有9个文本.那么如何找到这些文本呢: text1: Moby Dick by Herman Melville 1851 text2: Sense ...
- Css3视频教程下载
本套教程主要讲解了大量的CSS3新功能,包括: 边框.圆角.背景.渐变.阴影.文本特效.2D/3D转换.过渡.动画.伪类元素的使用等,同时伴随了大量的实例制作,比如CSS3实现红心的制作,火焰字.多彩 ...