首页 > 其他分享 >hdu 4990 Reading comprehension(矩阵乘法)

hdu 4990 Reading comprehension(矩阵乘法)

时间:2024-01-15 15:35:34浏览次数:22  
标签:hdu const int 矩阵 comprehension 4990 ans include define

Read the program below carefully then answer the question.

pragma comment(linker, "/STACK:1024000000,1024000000")

include

include

include

include

include

include

const int MAX=100000*2;
const int INF=1e9;

int main()
{
int n,m,ans,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(i=1;i<=n;i++)
{
if(i&1)ans=(ans2+1)%m;
else ans=ans
2%m;
}
printf("%d\n",ans);
}
return 0;
}

可以按照奇偶分类,找到偶数项或是奇数项的公式然后直接算。
也可以直接两种转移矩阵写出来
假设A,B分别是奇数和偶数的转移矩阵,虽然他们是交替的,我们不能直接用快速幂,但是可以利用结合律,将BA看做整体算。本质和先算出偶数项公式一样。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<bitset>
#include<cmath>
#include<set>
#include<unordered_map>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
//#define A puts("Yes")
//#define B puts("No")
using namespace std;
typedef double db;
typedef long long ll;
//typedef __int128 i128;
const int N=1e6+5;
const ll inf = 1ll << 60;
//const ll mo=1000000007;
ll m,n;
struct mat{
	ll a[3][3];
	void init() {
		memset(a,0,sizeof(a));
	}
	friend mat operator * (const mat &a,const mat &b) {
		mat c;
		c.init();
		fo(i,1,2) fo(j,1,2) fo(k,1,2) {
			c.a[i][j]+=a.a[i][k]*b.a[k][j]%m;
			c.a[i][j]%=m;
		}
		return c;
	}
	void print(){
		fo(i,1,2) {
			fo(j,1,2) printf("%lld ",a[i][j]);
			printf("\n");
		}
	}
}; 
//ll power(ll a,ll b){
//	ll t=1,y=a;
//	while (b) {
//		if (b&1) t=t*y%m;
//		y=y*y%mo;
//		b/=2;
//	}
//	return t;
//}
void solve(ll b){
	mat t,y;
	t.init();
	y.init();
	t.a[2][1]=1;
	y.a[1][1]=4; y.a[1][2]=2; y.a[2][2]=1;
	
	while (b) {
		if (b&1) t=y*t;
		y=y*y;
		b/=2;
	}
	
	ll ans=t.a[1][1];
	if (n&1) ans=(ans*2ll+1ll)%m;
	printf("%lld\n",ans);
}
int main()
{
//	freopen("data.in","r",stdin);

	while (scanf("%lld %lld",&n,&m)!=EOF) {
		solve(n/2);
	}

	return 0;
}


	

标签:hdu,const,int,矩阵,comprehension,4990,ans,include,define
From: https://www.cnblogs.com/ganking/p/17965457

相关文章

  • HDU 4686 Arc of Dream(构造矩阵)
    设\(t_n=a_n*b_n\)把\(a_n和b_n\)拆出来\(t_n=(a_{n-1}*ax+ay)(b_{n-1}*bx+by)\)\(t_n=ax*bx*t_{n-1}+ax*by*a_{n}+ay*bx*b_{n-1}+ay*by\)那么同时维护\(s_n,t_n,a_n,b_n和常数即可\)#include<cstdio>#include<algorithm>#include<cstring>#include&l......
  • 双向广搜-> hdu1195
    问题描述:密码锁有起始和目标两个状态,状态有4个连续数字,数字范围是1~9。其中特殊情况9+1=0,1-1=9。每次操作可以交换相邻的两个锁上的数字,或者将该位上数字±1。求最小操作次数分析:是一道双向广搜的题,但是这个题目的第一个思路就是枚举所有的排列组合状态,然后对每个状......
  • Flashduty 案例分享 - 途游游戏
    Flashduty 作为功能完备的事件OnCall中心,可以接入云上、云下不同监控系统,统一做告警降噪分派、认领升级、排班协同,已经得到众多先进企业的认可。我们采访了一些典型客户代表,了解他们的痛点、选型考虑和未来展望,集成本系列文章,以飨读者。本次有幸在邹老板支持下访谈到途游资......
  • HDU 1404 ”Solitaire“ (双向广搜)
    HDU1404”Solitaire"OJ:https://acm.hdu.edu.cn/showproblem.php?pid=1401题目大意:8*8的棋盘,上面有四个棋子,棋子可以上下左右移动,如果在上下左右移动的时候该位置有一个棋子已经放置,可以跳过这个棋子放在后面,不可以连续跳过两个。给一个初始状态和一个目标状态。是否可以在......
  • FlashDuty Changelog 2023-10-30 | 告警路由与 Slack 应用
    FlashDuty:一站式告警响应平台,前往此地址免费体验!告警路由什么是告警路由?FlashDuty已经与Zabbix、Prometheus等监控系统实现无缝集成,通过一个简单的webhook就可以把告警系统产生的所有告警事件推送到FlashDuty来管理。每个告警事件的重要性、紧急程度和所属团队可能不同,我们期望可以......
  • 【HDU 1276】士兵队列训练问题 题解(链表+模拟)
    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至......
  • HDU7401 流量监控
    给定一颗\(n\)个节点的树。求:有多少种匹配\((a_1,b_{1}),\cdots,(a_{\frac{n}{2}},b_{\frac{n}{2}})\),使得对于每一对匹配\((u,v)\),点\(u\)是点\(v\)的祖先。对于一组合法匹配,定义其权值为这些匹配的交点个数。对于两组匹配\((a,b),(c,d)\),它们之间有一个交点当且仅当......
  • [HDU 3483] A Very Simple Problem 题解
    题目描述快速求出下面式子的值:\[\left(\sum\limits_{k=1}^{N}k^{x}x^{k}\right)\bmodM\]其中\(1≤N,M≤2\times10^9\),并且\(1≤x≤50\)。题解(solution)对于该类题目,\(N\)很大,而\(x\)很小,考虑矩阵快速幂优化。对于每一个\(N\)的答案,我们用\(f(N)\)来......
  • FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心
    FlashDuty:一站式告警响应平台,前往此地址免费体验!自定义字段FlashDuty已支持接入大部分常见的告警系统,我们将推送内容中的大部分信息放到了Lables进行展示。尽管如此,我们用户还是会有一些扩展或定制性的需求,比如人工标记一个故障是否为误报。因此我们提供了自定义字段功能,......
  • HDU 5834 Magic boy Bi Luo with his excited tree
    题意:给出一棵\(n\)个节点的树,树上每一个节点都有一个权值\(v\),每条边都有一个代价\(w\),从一个点出发,经过一个点可以得到等同于其点权的收益,经过一个点可以得到等同于其点权的收益,经过一条边可以得到等同于其权值的代价,点权只会获得一次,但是代价会花费多次。对于每个点,询问从这个......