結果
| 問題 |
No.906 Y字グラフ
|
| コンテスト | |
| ユーザー |
otamay6
|
| 提出日時 | 2019-11-29 08:13:34 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 3,022 bytes |
| コンパイル時間 | 1,791 ms |
| コンパイル使用メモリ | 167,856 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-20 21:15:45 |
| 合計ジャッジ時間 | 2,737 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 28 |
ソースコード
#include<bits/stdc++.h>
#define REP(i,n) for(int i=0,i##_len=(n);i<i##_len;++i)
#define rep(i,a,b) for(int i=int(a);i<int(b);++i)
#define All(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
ll mod=1e9+7;
class mint {
private:
ll _num,_mod;
mint set(ll num){
_num = num ;
if(_num>=0) _num%=_mod;
else _num+=(1-(_num+1)/_mod)*_mod;
return *this;
}
ll _mpow(ll x, ll n){ //x^n(mod) ←普通にpow(x,n)では溢れてしまうため,随時mod計算 2分累乗法だから早い
ll ans = 1;
while(n != 0){
if(n&1) ans = ans*x % _mod;
x = x*x % _mod;
n = n >> 1;
}
return ans;
}
ll imod(ll n){return _mpow(n , _mod-2);}
public:
mint(){ _num = 0;_mod=mod; }
mint(ll num){ _mod = mod; _num = (num+(1LL<<25)*mod) % mod; }
mint(ll num,ll M){ _mod=M;_num=(num+(1LL<<25)*mod)%_mod; }
mint(const mint &cp){_num=cp._num;_mod=cp._mod;}
mint operator= (const ll x){ return set(x); }
mint operator+ (const ll x){ return mint(_num + (x % _mod) , _mod); }
mint operator- (const ll x){ return mint(_num - (x % _mod), _mod); }
mint operator* (const ll x){ return mint(_num * (x % _mod) , _mod); }
mint operator/ (ll x){ return mint(_num * imod(x) , _mod);}
mint operator+=(const ll x){ return set(_num + (x % _mod)); }
mint operator-=(const ll x){ return set(_num - (x % _mod)); }
mint operator*=(const ll x){ return set(_num * (x % _mod)); }
mint operator/=(ll x){ return set(_num * imod(x));}
mint operator+ (const mint &x){ return mint(_num + x._num , _mod); }
mint operator- (const mint &x){ return mint(_num - x._num , _mod);}
mint operator* (const mint &x){ return mint(_num * x._num , _mod); }
mint operator/ (mint x){ return mint(_num * imod(x._num) , _mod);}
mint operator+=(const mint &x){ return set(_num + x._num); }
mint operator-=(const mint &x){ return set(_num - x._num); }
mint operator*=(const mint &x){ return set(_num * x._num); }
mint operator/=(mint x){ return set(_num * imod(x._num));}
bool operator<(const mint &x)const{return _num<x._num;}
bool operator==(const mint &x)const{return _num==x._num;}
bool operator>(const mint &x)const{return _num>x._num;}
friend mint operator+(ll x,const mint &m){return mint(m._num + (x % m._mod) , m._mod);}
friend mint operator-(ll x,const mint &m){return mint( (x % m._mod) - m._num , m._mod);}
friend mint operator*(ll x,const mint &m){return mint(m._num * (x % m._mod) , m._mod);}
friend mint operator/(ll x,mint m){return mint(m.imod(m._num) * x , m._mod);}
explicit operator ll() { return _num; }
explicit operator int() { return (int)_num; }
friend ostream& operator<<(ostream &os, const mint &x){ os << x._num; return os; }
friend istream& operator>>(istream &is, mint &x){ll val; is>>val; x.set(val); return is;}
};
int main(){
ll N;cin>>N;
N--;
mint t=N/3;
mint ans=N*t-3*t*(t+1)/2+t;
ll K;
if(N&1) K=((N/3)+1)/2;
else K=(N/3)/2;
ans=(ans-K)/2+K;
cout<<ans<<endl;
}
otamay6