結果
| 問題 |
No.1172 Add Recursive Sequence
|
| コンテスト | |
| ユーザー |
auaua
|
| 提出日時 | 2020-08-16 22:22:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 452 ms / 4,000 ms |
| コード長 | 1,876 bytes |
| コンパイル時間 | 1,924 ms |
| コンパイル使用メモリ | 178,536 KB |
| 実行使用メモリ | 8,064 KB |
| 最終ジャッジ日時 | 2024-10-11 10:44:09 |
| 合計ジャッジ時間 | 4,359 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 16 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i,m,n) for(int i=(m);i<(n);i++)
#define rep(i,n) REP(i,0,n)
#define pb push_back
#define all(a) a.begin(),a.end()
#define rall(c) (c).rbegin(),(c).rend()
#define mp make_pair
#define endl '\n'
#define vec vector<ll>
#define mat vector<vector<ll> >
#define fi first
#define se second
typedef long long ll;
typedef pair<ll,ll> pll;
typedef long double ld;
const ll inf=1e9+7;
const ll mod=998244353;
signed main(){
ll k,n,m;cin>>k>>n>>m;
vector<ll>a(100210);
vector<ll>c(k);
rep(i,k)cin>>a[i];
rep(i,k)cin>>c[i];
//aの生成
REP(i,k,100210){
ll res=0;
rep(j,k){
res=(res+a[i-j-1]*c[j]%inf)%inf;
}
a[i]=res;
}
//L以上に全て操作行ってから、R以上に全て操作をおこなったものを引く
vector<ll>L(m);
vector<pll>R(m);
rep(i,m){
cin>>L[i]>>R[i].first;
R[i].second=R[i].first-L[i];
}
vector<ll>x(100210);
sort(all(L));
ll i=0;
REP(j,k,100210){
while(i<m&&j>=L[i]+k){
rep(l,k){
x[L[i]+l]=(x[L[i]+l]+a[l])%inf;
}
i++;
}
ll res=0;
rep(l,k){
res=(res+c[l]*x[j-l-1]%inf)%inf;
}
x[j]=(x[j]+res)%inf;
}
//引く方
i=0;
vector<ll>y(100210);
sort(all(R));
REP(j,k,100210){
while(i<m&&j>=R[i].first+k){
//cout<<R[i].first<<' '<<j<<endl;
rep(l,k){
y[R[i].first+l]=(y[R[i].first+l]+a[R[i].second+l])%inf;
}
i++;
}
ll res=0;
rep(l,k){
res=(res+c[l]*y[j-l-1]%inf)%inf;
}
y[j]=(y[j]+res)%inf;
}
rep(i,n){
ll ans=(x[i]-y[i])%inf;
if(ans<0)ans+=inf;
cout<<ans<<endl;
}
}
auaua