zoukankan      html  css  js  c++  java
  • HDU 5667 :Sequence

    Sequence

     
     Accepts: 59
     
     Submissions: 650
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    问题描写叙述
           Lcomyn 是个非常厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到了一个数列:
    
    f_n=left{egin{matrix} 1 ,&n=1 \ a^b,&n=2 \ a^bf_{n-1}^cf_{n-2},&otherwise end{matrix}
    ight.fn=1,ab,abfn1cfn2,n=1n=2otherwise
    
           他给了你几个数:nn,aa,bb,cc,你须要告诉他f_nfnpp后的数值.
    输入描写叙述
           第一行一个数T,为測试数据组数.
    
           每组数据一行,一行五个正整数,按顺序为nn,aa,bb,cc,pp.
    
        1le T le 10,1le nle 10^{18}    1T10,1n1018,1le a,b,cle 10^91a,b,c109,p是质数且ple 10^9+7p109+7.
    输出描写叙述
           对每组数据输出一行一个数,输出f_nfnpp取模后的数值.
    输入例子
    1
    5 3 3 3 233
    输出例子
    190

    发现f序列就是a的不同指数的形式。所以对每个f对a取对数。发现就是f[n]=b+c*f[n-1]+f[n-2]。

    构造矩阵,高速幂搞。

    注意由于是在指数上。所以模的值须要是欧拉函数p,由于p是质数。所以直接是p-1。

    代码:

    #pragma warning(disable:4996)
    #include <iostream>
    #include <functional>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <set>
    #include <map>
    using namespace std;
    typedef long long ll;
    
    #define INF 0x333f3f3f
    #define repp(i, n, m) for (int i = n; i <= m; i++)
    #define rep(i, n, m) for (int i = n; i < m; i++)
    #define sa(n) scanf("%d", &(n))
    
    const ll mod = 100000007;
    const int maxn = 5e5 + 5;
    const double PI = acos(-1.0);
    
    ll n, a, b, c, p;
    
    struct ma
    {
    	ll val[4][4];
    	ma operator *(const ma &b)
    	{
    		int i, j, k;
    		ma res;
    		memset(res.val, 0, sizeof(res.val));
    
    		for (k = 1; k <= 3; k++)
    		{
    			for (i = 1; i <= 3; i++)
    			{
    				for (j = 1; j <= 3; j++)
    				{
    					res.val[i][j] += (this->val[i][k] * b.val[k][j]) % (p - 1);
    					res.val[i][j] %= (p - 1);
    				}
    			}
    		}
    		return res;
    	}
    };
    
    ll po(ll x, ll y)
    {
    	ll res = 1;
    	while (y)
    	{
    		if (y & 1)
    			res = res*x%p;
    		x = x*x%p;
    		y >>= 1;
    	}
    	return res;
    }
    
    ma po_matrix(ma &x, ll y)
    {
    	ma res;
    	res.val[1][1] = 1, res.val[1][2] = 0, res.val[1][3] = 0;
    	res.val[2][1] = 0, res.val[2][2] = 1, res.val[2][3] = 0;
    	res.val[3][1] = 0, res.val[3][2] = 0, res.val[3][3] = 1;
    	while (y)
    	{
    		if (y & 1)
    			res = res*x;
    		x = x*x;
    		y >>= 1;
    	}
    	return res;
    }
    
    void solve()
    {
    	ll i, j, k;
    	scanf("%lld%lld%lld%lld%lld", &n, &a, &b, &c, &p);
    	
    	ll res;
    	ma r;
    	if (n == 1)
    	{
    		puts("1");
    	}
    	else if (n == 2)
    	{
    		res = po(a, b);
    		printf("%lld
    ", res);
    	}
    	else
    	{
    		r.val[1][1] = c, r.val[1][2] = 1, r.val[1][3] = b;
    		r.val[2][1] = 1, r.val[2][2] = 0, r.val[2][3] = 0;
    		r.val[3][1] = 0, r.val[3][2] = 0, r.val[3][3] = 1;
    
    		r = po_matrix(r, n - 2);
    		res = r.val[1][3] + r.val[1][1] * b;
    		res = po(a, res);
    		printf("%lld
    ", res);
    	}
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE  
    	freopen("i.txt", "r", stdin);
    	freopen("o.txt", "w", stdout);
    #endif
    
    	int t;
    	scanf("%d", &t);
    
    	while (t--)
    	{
    		solve();
    	}
    
    	return 0;
    }
    


  • 相关阅读:
    TSQL(3)批处理
    TSQL(5)操作数据行
    如何设计数据库(1)?
    搜索引擎处理查询
    如何进行shell脚本正确性测试
    机房收费系统用户级别查询
    PageRank算法
    链接分析算法之:SALSA算法
    机器学习排序
    倒排索引搜索引擎的基石
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7228390.html
Copyright © 2011-2022 走看看