快速幂和矩阵快速幂板子哦

快速幂的证明(https://www.luogu.com.cn/problem/solution/P1226)看这个就行啦https://www.luogu.com.cn/problem/P1226这个是题,然后捏代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int k;
int mod;
signed main()
{
	int ans=1;
	scanf("%lld%lld%lld",&n,&k,&mod);
	printf("%lld^%lld mod %lld=",n,k,mod);
	while(k>0)
	{
		if(k%2!=0) ans=(ans*n)%mod;
		n=(n*n)%mod;
		k=k>>1;
	}
	printf("%lld",ans);
	return 0;
 } 

P3390 【模板】矩阵快速幂(https://www.luogu.com.cn/problem/P3390)

通常用来优化一些奇奇怪怪的柿子,嗯,不会推!

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct node 
{
	int n,m;
	int a[102][102];
	node() 
	{
		memset(a,0,sizeof(a));
	};
	void bd(int x)
	{
		n=x;
		m=x;
		for(int i=1;i<=x;i++) a[i][i]=1;
	}
	void it(int x,int y)
	{
		n=x;
		m=y;
		for(int i=1;i<=100;i++)
		{
			for(int j=1;j<=100;j++) a[i][j]=0;
		}
	}
};
node operator *(const node &a,const node &b)//重中之重!
{
	node fh;
	fh.it(a.n,b.m);
	for(int k=1;k<=(a.m+b.n)/2;k++)
	{
		for(int i=1;i<=a.n;i++)
		{
			for(int j=1;j<=b.m;j++) fh.a[i][j]=(fh.a[i][j]+a.a[i][k]*b.a[k][j])%1000000007;
		}
	}
	return fh;
} 
node a,b;
signed main()
{
	int k;
	scanf("%lld%lld",&n,&k);
	a.it(n,n);
	for(int i=1;i<=n;i++) 
	{
		for(int j=1;j<=n;j++) scanf("%lld",&a.a[i][j]);
	}
	node ans;
	ans.bd(n);
	while(k>0)
	{
		if(k%2==1) ans=ans*a;
		a=a*a;
		k=k>>1;
	}
//	printf("%d ",ans.n);
	for(int i=1;i<=ans.n;i++)
	{
		for(int j=1;j<=n;j++) printf("%lld ",ans.a[i][j]);
		printf("\n");
	}
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值