青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

coreBugZJ

此 blog 已棄。

全整數無浮點運算的 快速傅里葉變換FFT 加速 大整數乘法,整系數多項式乘法


我的模板,第一次實現,代碼不夠精簡優化



  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 
  5 using namespace std;
  6 
  7 template< int L, class T = intclass LT = long long >
  8 class  FFT
  9 {
 10 public : 
 11         FFT() {
 12                 n = -1;
 13         }
 14         void fft( T e[], int &m, int minL ) {
 15                 in( e, m, minL );
 16                 m = n;
 17                 fft();
 18                 out( e );
 19         }
 20         void ifft( T e[], int &m, int minL ) {
 21                 in( e, m, minL );
 22                 m = n;
 23                 ifft();
 24                 out( e );
 25         }
 26         T getP() {
 27                 return p;
 28         }
 29 private : 
 30         int isPrime( T x ) {
 31                 T i;
 32                 if ( x < 2 ) {
 33                         return 0;
 34                 }
 35                 /* overflow !! */
 36                 for ( i = 2; (LT)i*<= x; ++i ) {
 37                         if ( x % i == 0 ) {
 38                                 return 0;
 39                         }
 40                 }
 41                 return 1;
 42         }
 43         T powMod( T a, T b, T c ) {
 44                 T ans = 1;
 45                 a %= c;
 46                 while ( b > 0 ) {
 47                         if ( b & 1 ) {
 48                                 ans = ( (LT)ans * a ) % c;
 49                         }
 50                         a = ( (LT)a * a ) % c;
 51                         b >>= 1;
 52                 }
 53                 return ans;
 54         }
 55         /* p is a prime number */
 56         int isG( T g, T p ) {
 57                 T p0 = p - 1, i;
 58                 for ( i = 1; (LT)i*<= p0; ++i ) {
 59                         if ( p0 % i == 0 ) {
 60                                 if ( (powMod(g,i,p)==1&& (i<p0) ) {
 61                                         return 0;
 62                                 }
 63                                 if ( (powMod(g,p0/i,p)==1&& (p0/i<p0) ) {
 64                                         return 0;
 65                                 }
 66                         }
 67                 }
 68                 return 1;
 69         }
 70         int rev_bit( int i ) {
 71                 int j = 0, k;
 72                 for ( k = 0; k < bit; ++k ) {
 73                         j = ( (j<<1)|(i&1) );
 74                         i >>= 1;
 75                 }
 76                 return j;
 77         }
 78         void reverse() {
 79                 int i, j;
 80                 T t;
 81                 for ( i = 0; i < n; ++i ) {
 82                         j = rev_bit( i );
 83                         if ( i < j ) {
 84                                 t = a[ i ];
 85                                 a[ i ] = a[ j ];
 86                                 a[ j ] = t;
 87                         }
 88                 }
 89         }
 90         void in( T e[], int m, int minL ) {
 91                 int i, need = 0;
 92                 bit = 0;
 93                 while ( (1<<(++bit)) < minL )
 94                         ;
 95                 if ( n != (1<<bit) ) {
 96                         need = 1;
 97                         n = (1<<bit);
 98                 }
 99                 for ( i = 0; i < m; ++i ) {
100                         a[ i ] = e[ i ];
101                 }
102                 for ( i = m; i < n; ++i ) {
103                         a[ i ] = 0;
104                 }
105                 if ( need ) {
106                         init( 2110000000 );
107                 }
108         }
109         // lim2 >= bit
110         void init( int lim2, T minP ) {
111                 T k = 2, ig = 2;
112                 int i;
113                 do {
114                         ++k;
115                         p = ( (k<<lim2) | 1 );
116                 } while ( (p<minP) || (!isPrime(p)) );
117                 while ( !isG(ig,p) ) {
118                         ++ig;
119                 }
120                 for ( i = 0; i < bit; ++i ) {
121                         g[ i ] = powMod( ig, (k<<(lim2-bit+i)), p );
122                 }
123         }
124         void fft() {
125                 T w, wm, u, t;
126                 int s, m, m2, j, k;
127                 reverse();
128                 for ( s = bit-1; s >= 0--s ) {
129                         m2 = (1<<(bit-s));
130                         m = (m2>>1);
131                         wm = g[ s ];
132                         for ( k = 0; k < n; k += m2 ) {
133                                 w = 1;
134                                 for ( j = 0; j < m; ++j ) {
135                                         t = ((LT)(w)) * a[k+j+m] % p;
136                                         u = a[ k + j ];
137                                         a[ k + j ] = ( u + t ) % p;
138                                         a[ k + j + m ] = ( u + p - t ) % p;
139                                         w = ( ((LT)w) * wm ) % p;
140                                 }
141                         }
142                 }
143         }
144         void ifft() {
145                 T w, wm, u, t, inv;
146                 int s, m, m2, j, k;
147                 reverse();
148                 for ( s = bit-1; s >= 0--s ) {
149                         m2 = (1<<(bit-s));
150                         m = (m2>>1);
151                         wm = powMod( g[s], p-2, p );
152                         for ( k = 0; k < n; k += m2 ) {
153                                 w = 1;
154                                 for ( j = 0; j < m; ++j ) {
155                                         t = ((LT)(w)) * a[k+j+m] % p;
156                                         u = a[ k + j ];
157                                         a[ k + j ] = ( u + t ) % p;
158                                         a[ k + j + m ] = ( u + p - t ) % p;
159                                         w = ( ((LT)w) * wm ) % p;
160                                 }
161                         }
162                 }
163                 inv = powMod( n, p-2, p );
164                 for ( k = 0; k < n; ++k ) {
165                         a[ k ] = ( ((LT)inv) * a[ k ] ) % p;
166                 }
167         }
168         void out( T e[] ) {
169                 int i;
170                 for ( i = 0; i < n; ++i ) {
171                         e[ i ] = a[ i ];
172                 }
173         }
174 
175         T a[ L ], g[ 100 ], p;
176         int n, bit;
177 };
178 
179 
180 
181 
182 
183 #define  L  140000
184 typedef  long long Lint;
185 
186 FFT< L, int, Lint > fft;
187 char s[ L ];
188 
189 void bi_out( int a[] ) {
190         int i, n;
191         n = a[ 0 ];
192         for ( i = 0; i < n; ++i ) {
193                 s[ i ] = '0' + a[ n - i ];
194         }
195         s[ n ] = 0;
196         puts( s );
197 }
198 
199 int bi_in( int a[] ) {
200         int i, n;
201         if ( scanf( "%s", s ) != 1 ) {
202                 return 0;
203         }
204         a[ 0 ] = n = strlen( s );
205         for ( i = 0; i < n; ++i ) {
206                 a[ n - i ] = s[ i ] - '0';
207         }
208         return 1;
209 }
210 
211 void bi_mul( int c[], int a[], int b[] ) {
212         int m, n, p, g, i;
213 
214         n = ( (a[0]>b[0]) ? a[0] : b[0] );
215         n <<= 1;
216 
217         m = a[ 0 ];
218         fft.fft( a+1, m, n );
219 
220         m = b[ 0 ];
221         fft.fft( b+1, m, n );
222 
223         p = fft.getP();
224 
225         for ( i = 1; i <= m; ++i ) {
226                 c[ i ] = (Lint)a[ i ] * b[ i ] % p;
227         }
228         fft.ifft( c+1, m, m );
229         g = 0;
230         for ( i = 1; i <= m; ++i ) {
231                 g += c[ i ];
232                 c[ i ] = g % 10;
233                 g /= 10;
234         }
235         for ( i = a[0]+b[0]; (i>1)&&(c[i]==0); --i )
236                 ;
237         c[ 0 ] = i;
238 }
239 
240 int a[ L ], b[ L ], c[ L ];
241 
242 int main() {
243         while ( bi_in( a ) && bi_in( b ) ) {
244                 bi_mul( c, a, b );
245                 bi_out( c );
246         }
247         return 0;
248 }
249 


posted on 2011-04-05 21:11 coreBugZJ 閱讀(3353) 評論(0)  編輯 收藏 引用 所屬分類: AlgorithmMathematics

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品一香蕉国产线看观看| 亚洲国产精品久久精品怡红院| 激情综合网激情| 国产日韩欧美视频| 国产一区二区三区av电影| 国产一在线精品一区在线观看| 国产三级精品三级| 在线观看成人网| 亚洲国产精品久久久久秋霞不卡| 亚洲日本无吗高清不卡| 99视频超级精品| 亚洲欧美另类综合偷拍| 久久精品免费观看| 亚洲国产精品va在看黑人| 洋洋av久久久久久久一区| 亚洲午夜久久久| 久久精品官网| 欧美日韩亚洲国产精品| 国产精品专区第二| 亚洲国产乱码最新视频| 亚洲视频免费看| 久久影视三级福利片| 亚洲品质自拍| 欧美亚洲午夜视频在线观看| 乱码第一页成人| 国产精品99免费看 | 国产在线一区二区三区四区| 伊人久久成人| 亚洲视频免费看| 免播放器亚洲一区| 亚洲一品av免费观看| 久久男女视频| 国产精品久久网站| 久久精品视频网| 久久男人av资源网站| 亚洲欧美综合精品久久成人| 欧美激情黄色片| 欧美日韩中文字幕日韩欧美| 欧美日韩国产精品一区| 国产精品亚洲а∨天堂免在线| 欧美性做爰猛烈叫床潮| 国产精品网红福利| 日韩亚洲欧美精品| 久久久久久国产精品一区| 亚洲欧洲日本专区| 亚洲午夜电影| 久久中文字幕一区| 国产一区二区三区黄视频| avtt综合网| 欧美粗暴jizz性欧美20| 亚洲伊人网站| 欧美日韩第一页| 亚洲破处大片| 性欧美精品高清| 亚洲国产一区二区a毛片| 久久久久国产精品一区| 国产欧美日韩综合一区在线播放| 亚洲美女在线视频| 欧美大片一区二区| 久久国产夜色精品鲁鲁99| 国产精品成人一区二区网站软件| 亚洲人成毛片在线播放| 久久综合亚洲社区| 亚洲一区免费| 欧美日韩日日骚| 亚洲午夜精品视频| 妖精视频成人观看www| 欧美国产日韩一区二区在线观看| 国产一区香蕉久久| 久久久久成人精品| 久久国内精品自在自线400部| 一区二区三区国产精华| 欧美区一区二区三区| 99视频在线观看一区三区| 亚洲国产欧美一区二区三区同亚洲| 欧美一区二区| 韩日精品视频一区| 久久偷看各类wc女厕嘘嘘偷窃| 性欧美长视频| 国产精品自在欧美一区| 亚洲欧美中文日韩在线| 午夜精品久久久久久久久久久| 国产欧美一区二区三区沐欲| 久久久久国产一区二区| 亚洲破处大片| 亚洲视频免费观看| 一区二区三区视频免费在线观看| 国产精品福利av| 午夜精品久久久久99热蜜桃导演| 99re热这里只有精品视频| 国产精品亚发布| 久久阴道视频| 欧美激情区在线播放| 亚洲性av在线| 久久美女艺术照精彩视频福利播放| 亚洲高清av| 一区二区三区欧美在线| 国产精品视频xxx| 欧美**人妖| 欧美电影打屁股sp| 亚洲一级二级在线| 久久久久久综合| 99视频精品免费观看| 性色一区二区| 一区二区三区视频在线播放| 亚洲视频观看| 亚洲福利精品| 亚洲——在线| 日韩亚洲欧美高清| 久久免费黄色| 亚洲欧美日韩爽爽影院| 久久精品欧美日韩| 亚洲一区国产| 欧美成人综合网站| 久久免费高清视频| 国产模特精品视频久久久久| 亚洲日本成人女熟在线观看| 激情欧美一区二区| 亚洲欧美综合一区| 亚洲欧美怡红院| 欧美精品v国产精品v日韩精品| 久久久另类综合| 国产精品你懂的在线| 亚洲欧洲视频| 一区二区三区在线看| 亚洲一区二区三区四区视频| 日韩午夜免费| 欧美一区二粉嫩精品国产一线天| 一本到高清视频免费精品| 免费欧美网站| 老牛影视一区二区三区| 国产偷久久久精品专区| 亚洲在线网站| 亚洲一二三区在线| 欧美日本韩国| 日韩午夜av在线| 亚洲欧洲精品一区二区| 久久免费视频在线观看| 久久久久久久久伊人| 欧美日韩色综合| 亚洲免费播放| 一区二区三区四区国产精品| 欧美激情综合| 日韩特黄影片| 亚洲午夜黄色| 欧美日韩在线不卡一区| 亚洲精选在线| 亚洲乱码精品一二三四区日韩在线 | 免费在线一区二区| 国产区精品在线观看| 一区二区三区精品视频在线观看 | 亚洲网友自拍| 欧美劲爆第一页| 亚洲精品久久久久久久久久久久| 国内外成人免费激情在线视频| 亚洲视频在线免费观看| 午夜久久电影网| 国产精品实拍| 久久久久久亚洲精品中文字幕 | 欧美激情视频在线播放| 亚洲激情成人网| 欧美精品九九| 亚洲一区二区免费在线| 性欧美大战久久久久久久免费观看| 国产精品麻豆成人av电影艾秋| 亚洲视频大全| 老司机久久99久久精品播放免费| 黄色成人av在线| 欧美粗暴jizz性欧美20| 一本色道久久| 欧美综合77777色婷婷| 亚洲电影下载| 欧美日本在线| 香蕉久久夜色| 亚洲动漫精品| 亚洲永久在线观看| 国产欧美日韩在线| 欧美承认网站| 亚洲调教视频在线观看| 久久精品国产欧美亚洲人人爽| 亚洲国产精品久久久久秋霞不卡 | 欧美日韩国产另类不卡| 午夜在线视频一区二区区别| 久久精品视频在线看| 亚洲免费成人av电影| 欧美午夜电影一区| 欧美一区二区精美| 亚洲日韩欧美视频| 欧美在线一级视频| 一区二区电影免费观看| 国产亚洲欧美激情| 欧美日韩视频不卡| 久久国产一区二区三区| 日韩视频免费在线| 蜜桃av一区二区三区| 午夜久久久久久| 亚洲国产另类精品专区| 国产欧美91| 欧美视频中文字幕在线| 免费成人av|