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

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 閱讀(3358) 評論(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>
            先锋影音国产一区| 欧美在线999| 欧美激情中文字幕乱码免费| 欧美一区二区在线看| 欧美成人高清视频| 在线观看欧美视频| 亚洲国产精品久久| 日韩视频一区| 欧美精品v日韩精品v国产精品| 久久综合婷婷| 欧美激情亚洲一区| 国产精一区二区三区| 在线视频精品一区| 欧美亚洲专区| 欧美激情小视频| 国产精品久久久久久久久久三级| 国产精品麻豆va在线播放| 国产精品在线看| 亚洲电影免费观看高清| 一区二区三区日韩精品视频| 久久精品夜色噜噜亚洲a∨| 男女视频一区二区| 亚洲色诱最新| 欧美大胆成人| 国产一区二区欧美日韩| 日韩视频在线一区二区三区| 欧美中文在线观看国产| 亚洲人精品午夜在线观看| 亚洲毛片在线| 久久这里有精品15一区二区三区| 欧美午夜宅男影院| 91久久精品国产91久久性色| 欧美一区网站| 99精品99| 欧美国产日韩一二三区| 狠狠色丁香婷婷综合| 亚洲影视中文字幕| 91久久精品一区| 久久久久欧美精品| 国产日韩欧美一区二区三区在线观看| 日韩天堂在线观看| 欧美肥婆在线| 久久精品官网| 国产目拍亚洲精品99久久精品 | 欧美大片一区二区三区| 亚洲一级黄色| 欧美三日本三级三级在线播放| 狠狠色综合一区二区| 欧美一区二区视频在线观看2020 | 亚洲人成网站在线播| 久久激情综合| 国产日韩欧美高清| 欧美一区综合| 一区二区三区四区五区精品| 欧美日韩精品| 一本大道久久精品懂色aⅴ| 欧美亚洲视频| 日韩亚洲欧美高清| 亚洲无限乱码一二三四麻| 欧美激情一区二区三级高清视频 | 欧美日韩国产成人在线观看| 精品69视频一区二区三区| 久久国产婷婷国产香蕉| 午夜精品美女久久久久av福利| 欧美四级在线观看| 午夜精品福利视频| 午夜精品美女久久久久av福利| 国产目拍亚洲精品99久久精品| 亚洲专区国产精品| 亚洲男人的天堂在线| 国产日韩在线视频| 美女精品自拍一二三四| 欧美jizz19性欧美| 一区二区三区福利| 亚洲一区二区三区四区在线观看| 国产精品伦一区| 久久超碰97人人做人人爱| 久久激情网站| 日韩视频一区二区三区在线播放| 1024亚洲| 欧美激情亚洲自拍| 欧美日一区二区三区在线观看国产免| 中文欧美字幕免费| 午夜免费久久久久| 在线日韩视频| 日韩一级在线| 黄色成人在线| 亚洲国产午夜| 国产精品美女视频网站| 久久久久99精品国产片| 欧美14一18处毛片| 欧美亚洲一区| 欧美福利视频在线观看| 欧美激情一区二区三区蜜桃视频 | 欧美国产国产综合| 午夜精品久久99蜜桃的功能介绍| 欧美一区二区三区免费在线看| 在线观看日韩| 亚洲在线视频一区| 最新国产成人av网站网址麻豆| 一区二区欧美在线| 亚洲第一精品福利| 亚洲自拍16p| 亚洲免费观看高清在线观看| 香蕉免费一区二区三区在线观看| 亚洲精品国久久99热| 性色av一区二区怡红| 日韩亚洲精品视频| 六月天综合网| 久久久久综合一区二区三区| 欧美久久久久免费| 久久在线91| 国产欧美日韩综合| 99国产精品久久久久久久久久| 在线观看福利一区| 亚洲欧美福利一区二区| 欧美三级视频在线观看| 国产精品性做久久久久久| 亚洲第一主播视频| 韩国一区二区三区在线观看| 日韩视频在线观看国产| 在线观看亚洲精品视频| 欧美在线免费看| 久久国产夜色精品鲁鲁99| 国产精品高清网站| 99av国产精品欲麻豆| 日韩一区二区精品葵司在线| 麻豆精品传媒视频| 欧美成人一区二免费视频软件| 国产人妖伪娘一区91| 亚洲影院高清在线| 欧美一级播放| 国产日韩一区二区三区在线播放| 在线亚洲高清视频| 亚洲一区二区三区高清不卡| 欧美韩日一区二区三区| 亚洲第一黄色| 亚洲精品在线观| 欧美成人日韩| 欧美国产日韩在线| 亚洲日本免费| 欧美美女bb生活片| 亚洲黄色av| 99精品福利视频| 欧美区亚洲区| 在线亚洲一区观看| 欧美一区二区三区日韩| 国产亚洲亚洲| 久久久久高清| 亚洲国产成人精品久久| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美—级在线免费片| 亚洲美女啪啪| 午夜在线视频一区二区区别 | 日韩一区二区久久| 欧美日韩综合另类| 亚洲欧美日韩天堂| 美乳少妇欧美精品| aⅴ色国产欧美| 国产精品中文字幕欧美| 久久大逼视频| 亚洲人成在线影院| 午夜亚洲福利| 亚洲第一偷拍| 欧美视频日韩| 久久国产福利| 亚洲韩国精品一区| 亚洲欧美日韩天堂一区二区| 国产综合精品一区| 欧美美女bb生活片| 久久gogo国模啪啪人体图| 亚洲第一免费播放区| 亚洲自拍偷拍色片视频| 狠狠干综合网| 欧美日韩国产片| 久久成人精品无人区| 亚洲欧洲日本国产| 久久久噜噜噜久久中文字免| 欧美亚一区二区| 欧美国产日韩视频| 国产综合精品| 欧美精品久久99| 新67194成人永久网站| 亚洲二区精品| 性亚洲最疯狂xxxx高清| 亚洲成人在线视频播放| 欧美午夜精品久久久久久浪潮| 久久成人免费网| 日韩图片一区| 欧美成人精品一区二区| 亚洲欧美日韩精品久久久| 亚洲二区在线| 国产午夜精品久久久久久久| 欧美日韩国产成人在线91| 快播亚洲色图| 久久久激情视频| 亚洲尤物在线视频观看| 亚洲精选一区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 性一交一乱一区二区洋洋av|