貌似卡常求调
查看原帖
貌似卡常求调
1125000
wuming_z楼主2024/12/29 18:18

rt

#include <iostream>
using namespace std;
#define int __int128
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
inline int read(){
	char get=getchar();int out=0;
	while(get<'0')get=getchar();
	while(get>='0')out*=10,out+=get-'0',get=getchar();
	return out;
}
inline void write(int in,bool z=1){
	if(!in){
		if(z)putchar('0');
		return;
	}
	write(in/10,0);
	putchar(in%10+'0');
}
inline string to_string(int a,bool z=1){
	if(!a){
		if(z)return "0";
		return "";
	}
	string out;
	out+=(a%10+'0');
	return to_string(a/10,0)+out;
}
int mod=1e9+7;
struct node{
	int v[3][3]={};
	int n,m;
	node(){
		n=m=0;
	}
	node(int x,int y,bool one=0){
		n=x,m=y;
		if(one)for(int i=1;i<=2;i++)v[i][i]=1;
	}
	void one(){
		for(int i=1;i<=2;i++)v[i][i]=1;
	}
	int& operator()(int a,int b){
		return v[a][b];
	}
	string out(){
		string ret;
		for(int i=1;i<=n;i++){
			ret+="| ";
			for(int j=1;j<=m;j++){
				ret+=to_string(v[i][j]);
				ret+=" ";
			}
			ret+="|";
			if(i!=n)ret+="\n";
		}
		return ret;
	}
};
node mul(node a,node b){
	node c(a.n,b.m);
	for(int i=1;i<=a.n;i++)
	for(int k=1;k<=a.m;k++)
	for(int j=1;j<=b.m;j++){
		c.v[i][j]+=a.v[i][k]*b.v[k][j]%mod;
		c.v[i][j]%=mod;
	}
	return c;
}

string n,m;
int a,b,c,d;
node bim[10],bin[10],bimn[10];
node ans(1,2),mom(2,2),mon(2,2);
node ks(node a,int b){
	node c(a.n,a.m,1);
	while(b){
		if(b%2)c=mul(c,a);
		a=mul(a,a);
		b/=2;
	}
	return c;
}
node ksm(string b){
	node a(2,2,1);
	for(int i=0;i<b.length();i++){
		a=mul(a,bim[b[i]-'0']);
		if(i!=b.length()-1)a=ks(a,10);
	}
	return a;
}
node ksn(string b){
	node a(2,2,1);
	for(int i=0;i<b.length();i++){
		a=mul(a,bin[b[i]-'0']);
		if(i!=b.length()-1)a=ks(a,10);
	}
	return a;
}
node ksmn(string b){
	node a(2,2,1);
	for(int i=0;i<b.length();i++){
		a=mul(a,bimn[b[i]-'0']);
		if(i!=b.length()-1)a=ks(a,10);
	}
	return a;
}
signed main(int argc, char** argv) {
	for(int i=0;i<=9;i++)bim[i].n=2,bim[i].m=2;
	bim[0].one();
	for(int i=0;i<=9;i++)bin[i].n=2,bin[i].m=2;
	bin[0].one();
	for(int i=0;i<=9;i++)bimn[i].n=2,bimn[i].m=2;
	bimn[0].one();
	cin>>n>>m;
	n[n.length()-1]-=1;
	for(int i=n.length()-1;i>=1;i--){
		if(n[i]<'0')n[i-1]-=1,n[i]='9';
		else break;
	}if(n[0]=='0')n=n.substr(1,n.length()-1); 
	m[m.length()-1]-=1;
	for(int i=m.length()-1;i>=1;i--){
		if(m[i]<'0')m[i-1]-=1,m[i]='9';
		else break;
	}if(m[0]=='0')n=n.substr(1,m.length()-1); 
	a=read(),b=read(),c=read(),d=read();
	ans(1,1)=ans(1,2)=1;
	mom(1,1)=a,mom(2,1)=b,mom(1,2)=0,mom(2,2)=1;
	mon(1,1)=c,mon(2,1)=d,mon(1,2)=0,mon(2,2)=1;
	for(int i=1;i<=9;i++){
		bim[i]=mul(bim[i-1],mom);
	}
	for(int i=1;i<=9;i++){
		bin[i]=mul(bin[i-1],mon);
	}
	node ls;
	ls=mul(bin[1],ksm(m));
	for(int i=1;i<=9;i++){
		bimn[i]=mul(bimn[i-1],ls);
	}
	ans=mul(ans,mul(ksm(m),ksmn(n)));
//	ans=mul(ans,mul(ksm(m),mul(ksmn(n),ksn(n))));
	write(ans(1,1)%mod);
	return 0;
}
2024/12/29 18:18
加载中...