ABC 293 E

题目链接

前言

个人感觉这一场比赛 F<<E

题面描述

给出整数 A,X,M,求 i=0X1Ai

方法 1

2Y1i=0B1Ai=(i=0B12Ai)×(1+Ab+12)

2Y1i=0B1Ai=(i=0B12Ai)×(1+Ab+12)+AB1

例如,30+31+32+33=(30+31)×(1+32)。证明显然。

于是就可以分治。

点击查看代码
#include <bits/stdc++.h>

using namespace std;

#define dg(x) cout<<#x<<"="<<x<<endl

using ll = long long;

ll a,x,mod;

ll pw(ll n){
	ll res=1,b=a;
	while (n){
		if (n&1){
			res*=b%mod;
			res%=mod;
		}
		b=b%mod*b%mod;
		n>>=1;
	}
	return res;
}

ll cal(ll n){
	if (n==1){
		return 1;
	}
	ll res=cal(n/2)*(1+pw(n/2))%mod;
	if (n&1){
		res+=pw(n-1);
	}
	return res%mod;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>a>>x>>mod;
	cout<<cal(x)%mod<<endl;
	return 0;
}

方法 2

人类智慧可得,i=0X1Ai=AX1A1。但是不一定 gcd(A1,M)=1

因为 A1AX1,所以可以这样求答案:令 KAX1modM(A1)。答案是 KA1

要用 int128

点击查看代码
#define int __int128
 
int a,x,m;
 
int pw(int b,int n,int mod){
	int res=1;
	while (n){
		if (n&1){
			res=res*b%mod;
		}
		b=b%mod*b%mod;
		n>>=1;
	}
	return res;
}
 
signed main(){
	read(a);
	read(x);
	read(m);
  	if (a==1){
		int ret=x%m;
		print(ret);
		return 0;
    }
	int res=pw(a,x,m*(a-1));
	res-=1;
	res=(res+m*(a-1))%(m*(a-1));
	res/=(a-1);
	res%=m;
	print(res);
	return 0;
}

方法 3

AtCoder 的官方题解。

点击查看代码
#include <bits/stdc++.h>

using namespace std;

#define dg(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 2;

ll a,x,mod;

struct matrix {
	int mat[N][N];
	void assign(int a,int b,int c,int d){
		mat[0][0]=a;
		mat[0][1]=b;
		mat[1][0]=c;
		mat[1][1]=d;
	}
	void init(int f){
		memset(mat,0,sizeof mat);
		for (int i=0; i<N; i++){
			mat[i][i]=f*1;
		}
	}
	matrix operator * (const matrix &a){
		matrix res;
		res.init(0);
		for (int i=0; i<N; i++){
			for (int j=0; j<N; j++){
				for (int k=0; k<N; k++){
					(res.mat[i][j]+=1ll*mat[i][k]*a.mat[k][j]%mod)%=mod;
				}
			}
		}
		return res;
	}
	matrix operator ^ (ll x){
		matrix res;
		res.init(1);
		matrix a;
		for (int i=0; i<N; i++){
			for (int j=0; j<N; j++){
				a.mat[i][j]=mat[i][j];
			}
		}
		while (x){
			if (x&1){
				res=res*a;
			}
			a=a*a;
			x>>=1;
		}
		return res;
	}
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>a>>x>>mod;
	matrix f;
	f.assign(a,1,0,1);
	cout<<(f^x).mat[0][1]<<endl;
	return 0;
}
posted @   SFlyer  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示