NC19816. 电音之王
描述
输入描述
第一行一个整数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; }