結果
問題 | No.891 隣接3項間の漸化式 |
ユーザー |
![]() |
提出日時 | 2019-09-20 22:23:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 5,618 bytes |
コンパイル時間 | 1,882 ms |
コンパイル使用メモリ | 122,444 KB |
最終ジャッジ日時 | 2025-01-07 18:45:16 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 39 |
ソースコード
#include <algorithm>#include <cassert>#include <cctype>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstring>#include <deque>#include <functional>#include <iomanip>#include <iostream>#include <map>#include <numeric>#include <queue>#include <random>#include <set>#include <stack>#include <string>#include <tuple>#include <vector>#define rep(i, n) for (int i = 0; i < (int)(n); ++i)//#define cerr if(false) cerr#ifdef DEBUG#define show(...) cerr << #__VA_ARGS__ << " = ", debug(__VA_ARGS__);#else#define show(...) 42#endifusing namespace std;using ll = long long;using pii = pair<int, int>;template <typename T, typename S>ostream& operator<<(ostream& os, pair<T, S> a) {os << '(' << a.first << ',' << a.second << ')';return os;}template <typename T>ostream& operator<<(ostream& os, vector<T> v) {for (auto x : v) os << x << ' ';return os;}void debug() {cerr << '\n';}template <typename H, typename... T>void debug(H a, T... b) {cerr << a;if (sizeof...(b)) cerr << ", ";debug(b...);}//負の数を掛けたりするとバグるtemplate<int MOD>class Modint{public:int a;Modint(const long long v = 0):a(v % MOD){}int getmod() const{return MOD;}Modint operator+(const Modint rhs) const{return Modint(*this) += rhs;}Modint operator-(const Modint rhs) const{return Modint(*this) -= rhs;}Modint operator*(const Modint rhs) const{return Modint(*this) *= rhs;}Modint operator/(const Modint rhs) const{return Modint(*this) /= rhs;}Modint operator+(const long long rhs) const{return Modint(*this) += rhs;}Modint operator-(const long long rhs) const{return Modint(*this) -= rhs;}Modint operator*(const long long rhs) const{return Modint(*this) *= rhs;}Modint operator/(const long long rhs) const{return Modint(*this) /= rhs;}friend Modint operator+(const long long a, const Modint b){return b + a;}friend Modint operator-(const long long a, const Modint b){return -b + a;}friend Modint operator*(const long long a, const Modint b){return b * a;}friend Modint operator/(const long long a, const Modint b){return Modint(a) / b;}Modint &operator+=(const Modint rhs){a += rhs.a;if(a >= MOD){a -= MOD;}return *this;}Modint &operator-=(const Modint rhs){if(a < rhs.a){a += MOD;}a -= rhs.a;return *this;}Modint &operator*=(const Modint rhs){a = (long long)a * rhs.a % MOD;return *this;}Modint &operator/=(Modint rhs){int x = MOD - 2;while(x){if(x % 2){*this *= rhs;}rhs *= rhs;x /= 2;}return *this;}Modint &operator++(){*this += 1;return *this;}Modint &operator--(){*this -= 1;return *this;}Modint operator++(int){Modint res = *this;++(*this);return res;}Modint operator--(int){Modint res = *this;--(*this);return res;}Modint &operator+=(const long long rhs){*this += Modint(rhs);return *this;}Modint &operator-=(const long long rhs){*this -= Modint(rhs);return *this;}Modint &operator*=(const long long rhs){*this *= Modint(rhs);return *this;}Modint &operator/=(const long long rhs){*this /= Modint(rhs);return *this;}Modint operator+() const{return *this;}Modint operator-() const{return Modint()-*this;}bool operator==(const Modint rhs) const{return a == rhs.a;}bool operator==(const long long rhs) const{return a == rhs;}friend bool operator==(const long long a, const Modint b){return a == b.a;}bool operator!=(const Modint rhs) const{return a != rhs.a;}bool operator!=(const long long rhs) const{return a != rhs;}friend ostream &operator<<(ostream &os, const Modint x){os << x.a;return os;}friend istream &operator>>(istream &is, Modint &x){is >> x.a;return is;}explicit operator bool() const{return a > 0;}bool operator!(){return a == 0;}explicit operator int() const{return a;}explicit operator long long() const{return (long long) a;}friend Modint pow(Modint a, long long b){Modint res = 1;while(b){if(b % 2){res *= a;}a *= a;b /= 2;}return res;}};using mint = Modint<1000000007>;struct mat{mint a[2][2];mat operator*(mat b){mat c;rep(i,2)rep(j,2)rep(k,2)c.a[i][j] += a[i][k] * b.a[k][j];return c;}friend mat pow(mat b, ll k){mat res;rep(i,2)res.a[i][i] = 1;while(k){if(k & 1){res = res * b;}b = b * b;k /= 2;}return res;}};int main(){ll a, b, n;cin >> a >> b >> n;mat m;m.a[0][0] = a;m.a[0][1] = b;m.a[1][0] = 1;mat k = pow(m, n);cout << k.a[1][0] << "\n";}