結果
問題 | No.754 畳み込みの和 |
ユーザー | Arc |
提出日時 | 2019-10-02 22:17:44 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,250 bytes |
コンパイル時間 | 1,097 ms |
コンパイル使用メモリ | 107,944 KB |
実行使用メモリ | 47,420 KB |
最終ジャッジ日時 | 2024-10-03 06:02:50 |
合計ジャッジ時間 | 2,792 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
ソースコード
#include <algorithm> #include <cassert> #include <cmath> #include <cstdio> #include <deque> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> #include <cfloat> #include <complex> using std::cerr; using std::cin; using std::cout; using std::endl; //Copy from this line! typedef std::complex<double> Complex; std::vector<Complex> DFT(std::vector<Complex> func, int size, int sign){ if(size==1) return func; std::vector<Complex> result(size); std::vector<Complex> func_a(size/2); std::vector<Complex> func_b(size/2); for(int i=0;i<size/2;i++){ func_a[i]=func[2*i]; func_b[i]=func[2*i+1]; } func_a=DFT(func_a,size/2,sign); func_b=DFT(func_b,size/2,sign); Complex zeta(cos(2.0*M_PI/size),sin(2.0*M_PI/size)*sign); Complex zeta_pow(1); for(int i=0;i<size;i++){ result[i]=func_a[i%(size/2)]+zeta_pow*func_b[i%(size/2)]; zeta_pow*=zeta; } return result; } std::vector<Complex> InvDFT(std::vector<Complex> func, int size){ std::vector<Complex> result=DFT(func, size, -1); for(int i=0;i<size;i++){ result[i]/=size; } return result; } std::vector<Complex> MultyplyFunction(std::vector<Complex> func_f, std::vector<Complex> func_g){ int min_size=func_f.size()+func_g.size()+1; int size=1; while(size<min_size){ size*=2; } func_f.resize(size); func_g.resize(size); func_f=DFT(func_f,size,1); func_g=DFT(func_g,size,1); std::vector<Complex> func(size); for(int i=0;i<size;i++){ func[i]=func_f[i]*func_g[i]; } return InvDFT(func,size); } int main(void){ cout << std::fixed << std::setprecision(16); cin.tie(0); std::ios::sync_with_stdio(false); int n; cin>>n; std::vector<std::complex<double>> a(n+1),b(n+1); for(int i=0;i<=n;i++){ int x; cin>>x; a[i]=std::complex<double>(x); } for(int i=0;i<=n;i++){ int x; cin>>x; b[i]=std::complex<double>(x); } std::vector<std::complex<double>> c=MultyplyFunction(a,b); int64_t result=0; const int64_t MOD=1000000007; for(int i=0;i<=n;i++){ result+=lround(c[i].real()); result%=MOD; } cout<<result<<endl; return 0; }