JLOI 2015--有意义的字符串(矩阵乘法)

知道公式就不难了系列。。。

感觉吉林省选好变态。。。这还只是第一题呀。。。

%dalaoPoPoQQQ。。。

看了大佬的题解。。。懵逼了一晚。。。

今天早上的时候终于想明白了!!!

于是飞快地A过此题。。。

题意

B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求

注意:其中 0<b^2< = d<(b+1)^2< = 10^18,  n< = 10^18,并且 b mod 2=1,d mod 4=1

Solution

构造特征方程。。。构造矩阵。。。全靠YY(mdzz。。。

公式推导直接点下面的链接吧。。。特殊字符好难打。。。

再次%dalaoPoPoQQQ。。。

公式之后还要注意mod的值很大要用unsigned long long。。。

还有乘法要用快速乘,直接乘会爆炸。。。

想通了公式后再做这题就不难了。。。

代码

#include<iostream>
#include<cstdio>
#define LL long long
#define ULL unsigned long long
#define mod 7528443412579576937
using namespace std;
ULL qui(ULL a,ULL b){
	ULL s=0;
	while(b){
		if(b&1)
		    s=(s+a)%mod;
		b>>=1;
		a=(a+a)%mod;
	}
	return s;
}
struct jz{
	ULL x[2][2];
	friend jz operator *(const jz &a,const jz &b){
		jz tmp;
		for(int i=0;i<2;i++)
			for(int j=0;j<2;j++){
				tmp.x[i][j]=0;
				for(int k=0;k<2;k++)
				    tmp.x[i][j]=(tmp.x[i][j]+qui(a.x[i][k],b.x[k][j]))%mod;
			}
		return tmp;
	}
}A,T;
void pow(ULL z){
	while(z){
		if(z&1)
		    T=T*A;
		z>>=1;
		A=A*A;
	}
}
int main(){
	ULL b,d,n,b2,f=0;
	cin>>b>>d>>n;
	if(n==0){
		printf("1\n");
		return 0;
	}
	b2=qui(b,b);
	A.x[0][0]=b;A.x[0][1]=1;A.x[1][0]=((d-b2)/4)%mod;A.x[1][1]=0;
	T.x[0][0]=b;T.x[0][1]=2;T.x[1][0]=0;T.x[1][1]=0;
	pow(n-1);
	if(d!=b2&&n%2==0) f=1;
	T.x[0][0]=(T.x[0][0]-f+mod)%mod;
	cout<<T.x[0][0]<<endl;
	return 0;
}

This passage is made by Yukino.

时间: 2024-11-18 05:37:01

JLOI 2015--有意义的字符串(矩阵乘法)的相关文章

矩阵乘法在numpy/matlab/数学上的不同

数学意义上的矩阵乘法 注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和. 乘积-哈达马积(hadamard product) 乘积-克罗内克乘积 MatLab中的乘法()和点乘(.) a * b 是进行矩阵相乘, a.*b是a矩阵的每一个元素乘以b矩阵对应位置的元素 形成的一个新矩阵. Numpy In [1

【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法

题目描述 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 输入 一行三个整数 b;d;n 输出 一行一个数表示模 7528443412579576937 之后的结果. 样例输入 1 5 9 样例输出 76 提示 其中 0<b^2<=d<(b+1)^2<=10^18,n<=10^18,并且 b mod 2=1,d mod 4=1 题解 数论 高中数学 注意题目中给出的0<b^2<=d<(b+1)^2,这说明了什么?

【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)

4180: 字符串计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 164  Solved: 75 Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', 'D'.现在他要求蒟蒻yts1999构造一个新的字符串S,构造的方法是:进行多次操作,每一次操作选择T的一个子串,将其加入S的末尾. 对于一个可构

bzoj4002[JLOI2015]有意义的字符串

bzoj4002[JLOI2015]有意义的字符串 题意: 求((b+√d)/2)^n的整数部分.b*b<d<10^18,n<10^18,d%4==1,b*b%4==1,模数约等于7*10^18 题解: 神题.由一些性质可以得出一个数列:An=bAn-1+(d-b*b)/4*An-2,且这个数列的通项公式为An=((b+√d)/2)^n+((b-√d)/2)^n,且由题目条件得(d-b*b)/4为正整数,故可以用矩阵乘法求出An,由于(b-√d)/2∈(-1,0],故答案为(An)-1当

我们可以推测矩阵乘法最优解的时间复杂度么?

矩阵乘法的定义为: 按照定义,一个简单的方阵乘法伪代码如下: int A[48,48],B[48,48],C[48,48] for i in 1 to 48 for j in 1 to 48 for k in 1 to 48 C[i,j]+=B[i,k]*A[k,j] 三层嵌套,时间复杂度为O(n3),n为方阵的边长. 由于矩阵乘法的广泛运用,如何优化矩阵乘法运算,有重要的意义.在不考虑矩阵的疏密程度下,如何有效减少矩阵乘法中算术乘法的使用次数是一个主要的优化方向. 最早的矩阵乘法优化算法,是由

【BZOJ】【4002】【JLOI2015】有意义的字符串

构造线性递推式+矩阵乘法 题解戳PoPoQQQ 为了自己以后看的方便手打一遍好了>_> 求$( \frac{b+\sqrt{d}}{2} )^n$的整数部分对p取模后的值 其中$b\mod 2=1,d\mod 4=1,b^2 \leq d<(b+1)^2,n\leq10^{18}$ 思路: 构造数列$a_n=b*a_{n-1}+\frac{d-b^2}{4}*a_{n-2}$ 其中$a_0=2,a_1=b$ 然后我们求出这个数列的通项公式,得到$a_n=(\frac{b+\sqrt{d}

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def