列表

详情


NC19816. 电音之王

描述

终于活成了自己讨厌的样子。
听说多听电音能加快程序运行的速度。
定义一个数列,告诉你a0,a1,m0,m1,c,定义an=m0an-1+m1an-2+c对所有n≥ 2。

输入描述

第一行一个整数T(1≤ T≤ 1000),表示数据组数。
每组数据一行7个整数a0,a1,m0,m1,c,M,k,保证1≤ M≤ 1018,0≤ a0,a1,m0,m1,c< M, 2≤ k≤ 106,保证M为奇数。
保证

输出描述

对于每组数据,输出一行表示答案。

示例1

输入:

1
1 1 1 1 0 1000000007 10

输出:

904493530

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 1890ms, 内存消耗: 1112K, 提交时间: 2018-10-05 20:30:40

#include<bits/stdc++.h>
#define ll  long long
#define inf 0x3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define pa pair<int,int>
#define mkp(a,b) make_pair(a,b)
const int N=2e5+10;
const int mod=998244353;
using namespace std;

ll a[N],m0,m1,c,M,k,M4;
ll mul(ll a,ll b) {
	return a*b-(ll)((long double)a/M4*b)*M4;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--) {
		cin>>a[0]>>a[1]>>m0>>m1>>c>>M>>k;
		M4=(ll)4e18/M*M;
		ll ans=mul(a[0],a[1]);
		for(int i=2; i<=k; i++) {
			ll q=mul(m0,a[i-1])+mul(m1,a[i-2])+c;
			if(q>M) q-=M;
			if(q>M) q-=M;
			ans=mul(ans,q);
			a[i]=q;
		}
		cout<<(ans%M+M)%M<<endl;
	}
	return 0;
}

C++(clang++11) 解法, 执行用时: 1676ms, 内存消耗: 364K, 提交时间: 2021-02-11 13:21:16

#include <iostream>
using namespace std;
#define ll long long
int T;
ll a0,a1,m0,m1,c,M,k,res,ans,M4;
inline ll mul(ll a, ll b) {
    return a*b-(ll)((long double)a/M4*b)*M4;
}
int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld%lld%lld%lld%lld%lld", &a0, &a1, &m0, &m1, &c, &M, &k);
        M4 = (ll)4e18 / M * M;
        ans = mul(a0, a1);
        for (int i = 2; i <= k; ++i) {
            res = mul(m0, a1) + mul(m1, a0);
            if (res >= M4) res -= M4;
            res = res + c;
            ans = mul(ans, res);
            a0 = a1, a1 = res;
        }
        printf("%lld\n", (ans % M + M) % M);
    }
    return 0;
}

上一题