HDU 6395 Sequence 分段矩陣快速冪

題目連接

題意:就是求這個數列的前的第n項的值並mod1e9+7。

比賽的時候都知道是矩陣快速冪,但是就是不知道後面的向下取整怎麼處理,後來看到題解說的是分段矩陣快速冪才恍然大悟。

 

思路:整個題就是這個後面的那個向下取整不好處理,我的思路是把後面那個看成一個反比例函數en=\frac{p}{n} 當n在某一定區間內時en是一定的,在前面n比較小的時候變化是比較大的,當n越來越大時en變化越來越小,所以我們把en相同的分爲一段然後跑矩陣快速冪,其實一點都不難,就是因爲不敢想不敢寫。

代碼:寫的比較挫

#include<stdio.h>
#include<string.h>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define qq printf("QAQ\n");
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
const ll linf=8e18+9e17;
const int mod=1e9+7;
const double e=exp(1.0);
const double pi=acos(-1);
struct matrix{
	ll a[3][3];
};
matrix multipy(matrix a,matrix b)
{
	matrix  ans={0};
	for(int i=0;i<3;i++)
	for(int j=0;j<3;j++)
	for(int k=0;k<3;k++)
	ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
	return ans;
}
matrix quick_pow(matrix a,int n)
{
	matrix ans={0};
	for(int i=0;i<3;i++)ans.a[i][i]=1;
	while(n)
	{
		if(n&1)ans=multipy(ans,a);
		n/=2;
		a=multipy(a,a);
	}
	return ans;
}
ll getlimit(ll now,ll p)
{
	if(p/now!=p/(now+1))return now+1;
	else return p/((p/now)-(p%now==0))+(p%((p/now)-(p%now==0))!=0);//這個求一個分段的終點寫的巨醜 
}
int main()
{
	int t;
	ll a,b,c,d,p,n,e;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&p,&n);
		swap(a,b);
		if(n==1){printf("%lld\n",a);continue;}
		else if(n==2){printf("%lld\n",b);continue;}		
		matrix mat={d,c,1,1,0,0,0,0,1};
		ll st=3,en;
		while(st<=n)
		{
			if(st==p)en=st+1;
			else if(st>p)en=n+1 ;
			else {
					en=getlimit(st,p);//寫的最搓的部分了 
			}
			matrix now=quick_pow(mat,min(n+1,en)-st);
			ll newa=(now.a[0][0]*a%mod+now.a[0][1]*b%mod+now.a[0][2]*(p/st)%mod)%mod;//F[n] 
			now=quick_pow(mat,min(n+1,en)-st-1);
			ll newb=(now.a[0][0]*a%mod+now.a[0][1]*b%mod+now.a[0][2]*(p/st)%mod)%mod;//F[n-1] 
			a=newa;
			if(min(n+1,en)>2)b=newb;
			st=en;
		}
		printf("%lld\n",a);
	}
	return 0;
}
/*
2
1 1 1 1 100 12
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章