[NWPU2018]国庆训练赛第三场 2018-10-03

A - Thickest Burger
模拟 ,理解题意即可

#include<iostream>
#include<cstdio>
using namespace std;
int t; int a,b;
int main()
{
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%d%d",&a,&b);
		if(a>b)
		printf("%d\n",a+b+a);
		else
		printf("%d\n",b+a+b);
	}
	return 0;
}

B-Relative atomic mass
同上,也是模拟
队友又比我快,哼(¬︿̫̿¬☆)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n;
    string str;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>str;
        int a=str.length();
        int sum=0;
        for(int i=0;i<a;i++)
        {
            if(str[i]=='C')
                sum+=12;
            if(str[i]=='H')
                sum++;
            if(str[i]=='O')
                sum+=16;
        }
        printf("%d\n",sum);
    }
        return 0;
}

C - Recursive sequence
矩阵快速幂
递推公式已知,求某一项,相数又特别大,很容易让人想起矩阵快速幂求斐波那契数列。这道题与其思想类似。

  1. 用二项式定理将i^4拆开
  2. 求出转移方程
  3. 用快速幂解决问题

不会插入数学公式…上代码吧

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

const long long MOD=2147493647;
struct Matrix{
	long long arr[7][7];
	void Clean()
	{
		memset(arr, 0, sizeof(arr));
		for(long long i=0; i<7; i++)
			arr[i][i] = 1;
	}
};


/*void Clean(Matrix a){
    memset(a.arr, 0, sizeof(a.arr));
    for(long long i=0; i<7; i++)
        a.arr[i][i] = 1;
}*/

Matrix p = {
			1, 1, 0, 0, 0, 0, 0,
            2, 0, 0, 0, 0, 0, 0,
            1, 0, 1, 0, 0, 0, 0,
            4, 0, 4, 1, 0, 0, 0,
            6, 0, 6, 3, 1, 0, 0,
            4, 0, 4, 3, 2, 1, 0,
            1, 0, 1, 1, 1, 1, 1
           };
		   
Matrix multiply_Matrix(Matrix a, Matrix b)//乘法运算
{
    Matrix c;
    for(long long i=0; i<7; i++)
    {
        for(long long j=0; j<7; j++)
        {
            c.arr[i][j] = 0;
            for(long long k=0; k<7; k++)
            {
                c.arr[i][j] += (a.arr[i][k] * b.arr[k][j]) % MOD;
                c.arr[i][j] %= MOD;
            }
        }
    }
    return c;
}

Matrix quick_Mod_Matrix(long long m)//快速幂
{
    Matrix ans,b=p;
    ans.Clean();
    while(m)
    {
        if(m & 1)
            ans = multiply_Matrix(ans, b);
        m>>=1;
        b = multiply_Matrix(b, b);
    }
    return ans;
}

int main()
{
	long long t,n,a,b;
	cin>>t;
	while(t--)
	{
		cin>>n>>a>>b;
	    if(n==1) {cout<<a;continue;}
		if(n==2) {cout<<b;continue;}
		Matrix m=quick_Mod_Matrix(n-2);
		long long ans=b*m.arr[0][0] % MOD;
        ans=(ans + a*m.arr[1][0]%MOD) % MOD;ans=(ans + 16*m.arr[2][0]%MOD) % MOD;
        ans=(ans + 8*m.arr[3][0]%MOD) % MOD;ans=(ans + 4*m.arr[4][0]%MOD) % MOD;
        ans=(ans + 2*m.arr[5][0]%MOD) % MOD;ans=(ans+m.arr[6][0]) % MOD;
        cout<<ans<<endl;
	}
	return 0;
}
发布了38 篇原创文章 · 获赞 12 · 访问量 3963

猜你喜欢

转载自blog.csdn.net/int_lyy/article/details/82962449