1 条题解
-
0
C++ :
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vec; typedef vector<vec> mat; #define maxn 1000000007 ll x,y,z,aa,b,c; mat mul(mat &a,mat &b) { mat c(a.size(),vec(b[0].size())); for (int i=0;i<a.size();i++){ for (int k=0;k<b.size();k++){ for (int j=0;j<b[0].size();j++){ c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%maxn)%maxn; } } } return c; } mat pow(mat a,ll n) { mat b(a.size(),vec(a.size())); for (int i=0;i<a.size();i++){ b[i][i]=1; } while(n>0){ if (n&1) b=mul(b,a); a=mul(a,a); n>>=1; } return b; } ll solve(ll n) { mat a(3,vec(3)); //指定横纵坐标的大小 a[0][0]=aa;a[0][1]=b;a[0][2]=c; a[1][0]=1;a[1][1]=0;a[1][2]=0; a[2][0]=0;a[2][1]=1;a[2][2]=0; a=pow(a,n); return ( (a[0][0]*x)%maxn + (a[0][1]*y)%maxn + (a[0][2]*z)%maxn )%maxn; } int main() { ll n; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%lld",&n)){ scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&aa,&b,&c); if (n==3){ printf("%d\n",x); return 0; } if (n==2){ printf("%d\n",y); return 0; } if (n==1){ printf("%d\n",z); return 0; } printf("%lld\n",solve(n-3)); } return 0; }
- 1
信息
- ID
- 3353
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者