BZOJ 3992 SDOI2015 序列统计

此文章写给没有学过FFT, FNT的小伙伴看 , 神犇绕行QAQ

博主在没有善良学长的情况下 , 花了一天学习了快速傅立叶变换(FFT)和快速数论变换(FNT)(其实差不多啦…… )分享一下学习过程 , 如果哪位小伙伴也没有学长帮助 , 可以借鉴啦……

你需要把我的文字部分简略看一遍 , 再来看各个博客 , 这样会更有方向性。
分享一个博客Miskcoo’s这个小伙伴的前提知识写的很清楚 , 当你读到IDFT的时候可能有疑惑 , 此时你只需要暂时记住(等会来填坑) , IDFT和DFT的过程是相似的其它先不管 , 然后继续看迭代版本的DFT过程。 此时 , 你可以对着Rujia的代码看看 , 如下:

// Cooley-Tukey的FFT算法,迭代实现。inverse = false时计算逆FFT
inline void FFT(vector &a, bool inverse) {
  int n = a.size();
  // 原地快速bit reversal
  for(int i = 0, j = 0; i < n; i++) {
    if(j > i) swap(a[i], a[j]);
    int k = n;
    while(j & (k >>= 1)) j &= ~k;
    j |= k;
  }

  double pi = inverse ? -PI : PI;
  for(int step = 1; step < n; step <<= 1) {
    // 把每相邻两个“step点DFT”通过一系列蝴蝶操作合并为一个“2*step点DFT”
    double alpha = pi / step;
    // 为求高效,我们并不是依次执行各个完整的DFT合并,而是枚举下标k
    // 对于一个下标k,执行所有DFT合并中该下标对应的蝴蝶操作,即通过E[k]和O[k]计算X[k]
    // 蝴蝶操作参考:http://en.wikipedia.org/wiki/Butterfly_diagram
    for(int k = 0; k < step; k++) {
      // 计算omega^k. 这个方法效率低,但如果用每次乘omega的方法递推会有精度问题。
      // 有更快更精确的递推方法,为了清晰起见这里略去
      CD omegak = exp(CD(0, alpha*k)); 
      for(int Ek = k; Ek < n; Ek += step << 1) { // Ek是某次DFT合并中E[k]在原始序列中的下标
        int Ok = Ek + step; // Ok是该DFT合并中O[k]在原始序列中的下标
        CD t = omegak * a[Ok]; // 蝴蝶操作:x1 * omega^k
        a[Ok] = a[Ek] - t;  // 蝴蝶操作:y1 = x0 - t
        a[Ek] += t;         // 蝴蝶操作:y0 = x0 + t
      }
    }
  }

  if(inverse)
    for(int i = 0; i < n; i++) a[i] /= n;
}

// 用FFT实现的快速多项式乘法
inline vector<double> operator * (const vector<double>& v1, const vector<double>& v2) {
  int s1 = v1.size(), s2 = v2.size(), S = 2;
  while(S < s1 + s2) S <<= 1;
  vector a(S,0), b(S,0); // 把FFT的输入长度补成2的幂,不小于v1和v2的长度之和
  for(int i = 0; i < s1; i++) a[i] = v1[i];
  FFT(a, false);
  for(int i = 0; i < s2; i++) b[i] = v2[i];
  FFT(b, false);
  for(int i = 0; i < S; i++) a[i] *= b[i];
  FFT(a, true);
  vector<double> res(s1 + s2 - 1);
  for(int i = 0; i < s1 + s2 - 1; i++) res[i] = a[i].real(); // 虚部均为0
  return res;
}

你可能觉得分治有点不好理解 , 其实分治的对象就是 ωkn 的函数值 ,k[0,n) , 总体来说就是我们一步步把这玩意二分成若干小块 , 每一块相同位置的 ω 的下标在那一层分治中都是相同的(但是此时系数并不相同) , 分治后的每一次更新就是把相邻两块同一位置的 k n2+k 拿出来 , 交替更新(就是蝴蝶神马的)。

分治的前提是每次分裂后的那些奇偶系数都在一块 , 所以我们需要对这个序列进行重排(就是把二进制位倒过来 , 10110 变成 01101 )至于每个数怎么算它倒过来在哪里 , 这个问题Rujia代码是比较优秀的 , 其实就是记录上一个数倒过来的数是神马 , 然后在首位加一个 1 然后类似于进位一样的推到后面来。 诶 , 你可能觉得这玩意怎么分治到最后没有边界啊 , 其实边界就是数组本身 , 因为 ω01==1 , 所以 ω01×a[i]==a[i]

好 , 再来填坑 , 看刚刚那个博客 , 你会发现从矩阵的角度上来看 , IDFT和DFT长得差不多 , 其实就是把所有的正负号取反就可以得到一个这玩意的逆矩阵的 n 倍(千万不要以为是把矩阵元素值取反 , 实际上这个过程更像是除法)。 然而IDFT其实只用在FFT函数中上加一个标记就行啦。

再来两篇博客 , 这里面有模版题 , ACdreamer’s1 , ACdreamer’s2

最后想说FFT的想法真的很奇妙 , 虽然本人并没有实质上的优化算法 , 但这个想法打开了一扇门:-)

再说说本题:
首先 , 此题是一个DP题 , Vincent’s里说的很详细。不得不说这个小伙伴的代码常数巨大……

补充几点:
如果你只想拿60个点 , 那么你不需要学FNT , 直接把 n 快速幂算就可以啦。 FNT其实就是加速 m2 这个过程 , 为了能够FNT , 我们需要求此 m 的原根 , 注意区分两个原根。 这样整个表达式长的就像卷积形式啦……然后就可以AC了

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
typedef long long ll;
typedef vector vl;
const int maxm = 8100;
const int modu = 1004535809;

int n , m , x , s;
int a[maxm] , b[maxm];

ll powerMod(ll a , ll n , ll p)
{
    if(!n) return 1;
    ll res = powerMod(a, n/2, p);
    res = (res * res)%p;
    if(n&1) res = (res * a)%p;
    return (res+p)%p;
}

bool judge(int p , int a)
{
    int pp = p;
    for(int i=2;i*i<=p;i++) if(pp%i==0)
    {
        if(powerMod(a, p/i, p+1)==1) return false;
        while(pp%i==0) pp/=i; 
    }
    if(pp!=1 && powerMod(a, p/pp, p+1)==1) return false;
    return true;
}

int findRoot(int p)
{
    for(int i=2;;i++) if(judge(p-1, i)) return i;
}

void exGcd(ll a , ll b , ll& d , ll& x , ll& y)
{
    if(!b) x = 1 , y = 0 , d = a;
    else 
    {
        exGcd(b, a%b, d, y, x);
        y -= a/b*x;
    }
}

ll rev(ll a , ll p)
{
    ll x , y , d;
    exGcd(a, p, d, x, y);
    return x;
}

namespace FNT
{
    void FNTprocess(vl& a , bool rever = false)
    {
        int n = a.size();
        for(int i=0,j=0;iif(j > i) swap(a[i], a[j]);
            int k = n;
            while(j & (k >>= 1)) j &= ~k;
            j |= k;
        }

        for(int step=1;step1)
        {
            ll wn = powerMod(3, (modu-1)/step/2, modu) , w = 1;
            if(rever) wn = rev(wn, modu);
            for(int k=0;kfor(int i=k,j;i1)
                {
                    j = i+step;
                    ll now = (w*a[j])%modu;
                    a[j] = (a[i] - now)%modu;
                    a[i] = (a[i] + now)%modu;
                }
                w = (w*wn)%modu;
            }
        }
        int r = rev(n, modu);
        if(rever) for(int i=0;ioperator *(vl x , vl y)
    {
        int s1 = x.size() , s2 = y.size() , s = 2;
        while(s < s1 + s2) s <<= 1;

        vl a(s) , b(s);
        for(int i=0;ifor(int i=0;ifor(int i=0;itrue);

        vl c(s1 , 0);
        for(int i=0;ireturn c;
    }
}

using namespace FNT;

vl powerV(vl a , int n)
{
    if(n==1) return a;
    vl res = powerV(a, n/2);
    res = res*res;
    if(n&1) res = (res * a);
    return res;
}


int main(int argc, char *argv[]) {

    cin>>n>>m>>x>>s;

    int r = findRoot(m) , now = 1;

    for(int i=0;i1;i++)
    {
        b[now] = i;
        now = (now * r)%m;
    }

    for(int i=0;iint v;
        scanf("%d" , &v);
        if(!v) continue;
        a[b[v%m]]++;
    }

    vl res , hi;
    for(int i=0;i1;i++) res.push_back(a[i]);
    res = powerV(res, n);

    printf("%lld\n" , (res[b[x]]+modu)%modu);

    return 0;
}

最后附上TestData7:

Inputs:

152638504 5981 5475 3035
0 4 9 11 12 13 15 16 18 21 24 25 27 28 31 34 36 37 38 39 40 42 45 47 49 50 54 60 62 63 65 67 68 69 74 76 77 81 82 84 85 87 90 93 95 97 101 102 104 105 106 107 108 112 113 115 116 119 120 122 123 124 127 128 129 132 134 141 143 144 147 148 149 152 154 156 157 158 160 161 163 166 168 170 173 174 175 176 177 178 179 180 181 184 185 188 189 190 191 193 194 196 198 200 201 203 205 208 211 212 213 215 219 220 223 225 226 227 229 232 233 234 235 240 243 245 246 247 251 252 253 255 256 258 259 262 264 265 268 271 274 277 280 282 285 286 287 293 295 296 297 298 300 303 305 308 311 312 313 314 327 333 335 339 342 344 346 348 349 352 355 357 359 361 364 366 367 370 371 372 374 376 377 384 385 386 387 391 392 393 399 404 405 408 409 412 416 418 420 425 426 427 428 430 431 432 435 441 442 444 445 447 448 450 452 453 454 456 457 458 459 460 461 462 463 465 466 467 470 478 480 487 491 493 494 495 496 502 505 511 513 516 517 522 525 526 527 528 531 533 537 543 550 551 552 554 560 562 564 565 567 569 570 573 577 581 583 586 588 589 590 591 593 594 595 596 597 599 600 602 604 605 607 609 610 615 616 617 618 620 621 626 629 630 632 633 635 636 637 641 644 646 647 650 651 653 654 659 660 661 664 666 667 669 670 672 674 676 682 683 686 687 690 691 694 695 696 698 700 701 704 705 706 709 710 711 712 714 716 717 718 719 724 725 727 728 734 735 737 741 742 743 746 748 749 751 752 753 754 755 756 761 762 763 764 765 766 768 769 770 771 773 774 775 776 777 778 779 783 784 789 794 795 799 802 803 804 806 807 810 813 821 822 823 824 829 830 831 832 833 837 838 842 844 845 846 850 851 854 859 861 862 864 866 868 869 872 873 875 876 877 878 881 882 883 885 886 887 893 895 898 899 900 902 903 904 905 906 908 910 912 915 916 917 919 920 921 923 925 926 928 931 933 934 935 936 938 939 941 942 944 945 946 948 949 951 952 956 958 961 962 966 968 973 977 987 988 990 992 994 995 998 1000 1002 1003 1004 1006 1008 1010 1012 1013 1015 1018 1021 1022 1024 1025 1029 1030 1031 1037 1045 1049 1050 1051 1052 1053 1054 1055 1057 1058 1059 1063 1065 1066 1067 1068 1070 1072 1078 1080 1082 1085 1087 1088 1094 1102 1103 1104 1105 1108 1109 1110 1111 1112 1115 1116 1117 1118 1119 1121 1123 1124 1126 1127 1132 1133 1135 1137 1138 1140 1145 1146 1147 1148 1151 1152 1157 1162 1163 1164 1165 1170 1172 1175 1180 1184 1187 1188 1189 1191 1192 1193 1194 1195 1196 1198 1201 1204 1205 1207 1209 1210 1215 1218 1221 1222 1224 1226 1228 1229 1231 1234 1236 1237 1238 1243 1244 1245 1247 1249 1250 1252 1253 1254 1255 1256 1260 1262 1263 1266 1267 1269 1270 1271 1274 1275 1276 1278 1279 1282 1283 1284 1285 1287 1288 1289 1291 1292 1294 1296 1299 1301 1308 1311 1313 1316 1318 1319 1320 1323 1326 1329 1330 1332 1338 1342 1345 1348 1349 1350 1351 1353 1355 1356 1360 1362 1367 1368 1369 1372 1373 1374 1376 1379 1380 1382 1386 1388 1395 1396 1401 1402 1405 1407 1408 1410 1411 1412 1413 1414 1416 1420 1421 1422 1426 1427 1428 1431 1433 1434 1436 1437 1438 1440 1442 1443 1445 1446 1447 1450 1454 1456 1458 1462 1464 1465 1466 1469 1470 1473 1474 1479 1480 1482 1484 1485 1488 1489 1491 1495 1496 1501 1504 1505 1508 1509 1510 1513 1514 1516 1521 1522 1526 1528 1529 1533 1534 1535 1542 1545 1546 1548 1550 1552 1554 1557 1560 1561 1562 1565 1567 1569 1570 1572 1573 1574 1575 1576 1577 1579 1580 1581 1582 1583 1585 1587 1588 1589 1592 1593 1604 1605 1606 1609 1610 1611 1612 1615 1616 1617 1620 1621 1622 1625 1629 1631 1636 1637 1638 1639 1640 1643 1646 1647 1653 1654 1655 1658 1659 1660 1661 1662 1665 1669 1673 1678 1679 1680 1682 1683 1684 1687 1691 1692 1694 1695 1696 1697 1698 1701 1702 1703 1706 1708 1709 1710 1712 1718 1723 1725 1728 1729 1730 1732 1736 1741 1742 1744 1746 1747 1748 1749 1750 1754 1756 1757 1759 1763 1764 1767 1768 1769 1771 1772 1773 1774 1777 1780 1781 1783 1784 1785 1787 1788 1789 1790 1792 1794 1795 1796 1800 1802 1805 1809 1810 1813 1814 1816 1819 1822 1823 1825 1826 1829 1833 1838 1839 1840 1843 1845 1846 1847 1849 1850 1853 1854 1855 1856 1860 1865 1867 1870 1871 1874 1875 1879 1880 1881 1883 1884 1885 1888 1889 1890 1891 1894 1896 1897 1898 1903 1904 1905 1909 1910 1911 1916 1918 1920 1921 1922 1923 1925 1926 1927 1928 1930 1931 1933 1935 1938 1940 1943 1944 1945 1946 1949 1951 1952 1953 1956 1959 1961 1962 1965 1966 1967 1972 1973 1975 1976 1978 1979 1981 1982 1983 1984 1986 1987 1988 1989 1992 1993 1995 1996 1997 1998 1999 2000 2001 2002 2003 2007 2008 2010 2012 2013 2014 2016 2017 2018 2019 2020 2021 2024 2025 2026 2028 2029 2031 2035 2036 2037 2039 2040 2044 2046 2048 2049 2052 2057 2058 2059 2062 2064 2065 2066 2067 2069 2070 2072 2073 2074 2075 2077 2079 2080 2081 2083 2084 2085 2086 2092 2094 2095 2098 2099 2101 2102 2103 2104 2106 2108 2109 2111 2112 2113 2116 2117 2119 2120 2121 2123 2126 2130 2131 2132 2133 2134 2136 2137 2139 2140 2141 2143 2146 2147 2149 2151 2153 2155 2157 2158 2160 2162 2163 2164 2168 2169 2171 2173 2174 2175 2176 2177 2180 2182 2183 2185 2186 2188 2191 2192 2195 2196 2199 2200 2206 2207 2208 2209 2211 2214 2215 2216 2218 2219 2220 2222 2223 2224 2225 2226 2228 2229 2231 2233 2234 2235 2238 2239 2241 2242 2243 2244 2247 2248 2249 2250 2251 2252 2257 2260 2261 2262 2264 2266 2267 2269 2270 2271 2274 2279 2284 2285 2286 2294 2296 2298 2302 2303 2305 2306 2307 2310 2311 2312 2317 2318 2319 2320 2321 2322 2325 2326 2327 2332 2335 2336 2337 2339 2341 2344 2345 2349 2350 2352 2353 2355 2356 2360 2364 2365 2376 2377 2378 2379 2380 2382 2383 2385 2387 2391 2393 2398 2401 2405 2407 2409 2410 2411 2413 2415 2416 2418 2420 2423 2424 2425 2427 2428 2429 2430 2431 2434 2435 2440 2442 2443 2444 2445 2446 2447 2448 2451 2452 2455 2456 2457 2458 2459 2461 2462 2463 2464 2465 2466 2467 2468 2470 2471 2472 2474 2475 2477 2479 2481 2483 2486 2487 2489 2491 2497 2498 2499 2500 2501 2502 2504 2505 2507 2511 2514 2519 2522 2523 2524 2525 2526 2529 2531 2534 2535 2538 2539 2540 2543 2544 2545 2547 2550 2552 2553 2554 2555 2556 2557 2559 2560 2561 2564 2565 2567 2569 2571 2572 2575 2577 2578 2581 2582 2583 2585 2586 2588 2589 2590 2591 2592 2594 2600 2601 2603 2604 2606 2609 2610 2611 2612 2614 2617 2618 2620 2622 2632 2634 2640 2642 2644 2645 2646 2648 2649 2650 2654 2655 2656 2664 2669 2670 2671 2672 2673 2674 2675 2677 2678 2679 2680 2682 2686 2692 2694 2700 2702 2708 2711 2714 2715 2716 2719 2720 2721 2722 2723 2724 2729 2731 2732 2733 2735 2736 2739 2742 2744 2745 2746 2747 2750 2752 2754 2755 2757 2758 2760 2761 2763 2769 2772 2773 2774 2776 2778 2780 2781 2783 2784 2787 2789 2790 2792 2798 2799 2800 2802 2804 2805 2806 2807 2810 2816 2818 2819 2821 2822 2824 2825 2826 2828 2829 2831 2832 2833 2835 2837 2838 2839 2842 2843 2844 2847 2848 2850 2852 2854 2856 2859 2862 2864 2865 2866 2867 2869 2870 2872 2873 2874 2876 2879 2881 2885 2887 2888 2896 2897 2903 2904 2905 2906 2907 2908 2910 2914 2915 2916 2917 2918 2919 2922 2923 2928 2929 2930 2933 2934 2936 2938 2939 2940 2942 2944 2946 2947 2948 2949 2952 2953 2957 2960 2963 2964 2967 2969 2972 2973 2974 2975 2976 2977 2982 2987 2988 2992 2994 2995 2996 2997 3002 3003 3005 3007 3008 3009 3010 3011 3014 3015 3016 3017 3018 3020 3022 3024 3026 3027 3031 3032 3034 3037 3042 3046 3047 3048 3049 3050 3051 3056 3058 3059 3060 3061 3067 3068 3075 3077 3082 3084 3086 3087 3088 3089 3093 3094 3095 3096 3097 3099 3103 3104 3107 3113 3115 3117 3118 3120 3125 3127 3132 3133 3134 3135 3136 3142 3144 3146 3148 3149 3150 3151 3152 3156 3157 3158 3161 3162 3163 3167 3168 3169 3170 3171 3172 3174 3179 3182 3183 3187 3188 3192 3193 3194 3197 3199 3200 3201 3203 3205 3207 3210 3211 3213 3214 3216 3219 3220 3223 3225 3226 3229 3230 3231 3232 3236 3237 3240 3241 3245 3249 3251 3252 3253 3255 3256 3259 3260 3261 3262 3263 3265 3266 3267 3269 3270 3271 3272 3274 3278 3279 3280 3281 3282 3283 3284 3285 3286 3291 3292 3294 3295 3296 3297 3298 3300 3301 3302 3305 3307 3309 3310 3311 3312 3313 3314 3315 3321 3325 3327 3330 3332 3333 3336 3337 3338 3339 3342 3345 3349 3350 3351 3352 3353 3354 3357 3358 3359 3360 3363 3364 3369 3371 3372 3373 3374 3375 3378 3380 3383 3384 3386 3388 3389 3392 3396 3397 3398 3400 3402 3404 3405 3406 3409 3410 3411 3415 3416 3417 3418 3419 3428 3430 3431 3432 3433 3434 3437 3441 3443 3444 3447 3448 3449 3451 3452 3455 3457 3458 3460 3461 3462 3463 3464 3465 3466 3470 3473 3474 3476 3480 3483 3487 3488 3490 3491 3493 3496 3497 3500 3501 3504 3505 3506 3507 3510 3511 3513 3515 3516 3522 3523 3526 3528 3536 3539 3543 3544 3547 3548 3550 3554 3555 3556 3557 3559 3560 3561 3562 3565 3568 3569 3574 3575 3577 3579 3580 3581 3583 3584 3585 3587 3590 3591 3592 3597 3600 3601 3603 3605 3606 3607 3608 3611 3612 3615 3616 3618 3619 3620 3621 3622 3623 3624 3630 3631 3632 3633 3634 3636 3638 3642 3644 3645 3646 3649 3651 3652 3653 3654 3655 3656 3659 3661 3662 3663 3667 3668 3669 3670 3671 3672 3673 3674 3676 3678 3679 3680 3681 3683 3684 3685 3686 3688 3689 3690 3691 3692 3693 3694 3697 3701 3702 3712 3713 3715 3717 3719 3720 3722 3723 3724 3725 3728 3729 3730 3731 3732 3736 3737 3738 3739 3741 3742 3743 3744 3747 3749 3750 3752 3759 3761 3762 3763 3766 3767 3769 3770 3771 3772 3777 3778 3779 3780 3783 3784 3786 3788 3791 3793 3794 3796 3798 3799 3800 3801 3806 3807 3808 3809 3811 3812 3816 3817 3818 3819 3822 3827 3828 3829 3830 3831 3834 3836 3840 3841 3842 3844 3847 3849 3851 3852 3854 3857 3858 3861 3862 3863 3865 3866 3867 3868 3869 3871 3872 3873 3874 3877 3879 3880 3881 3884 3885 3887 3889 3893 3894 3897 3900 3902 3903 3907 3908 3910 3912 3913 3915 3916 3917 3919 3921 3922 3923 3925 3929 3930 3934 3938 3939 3943 3945 3948 3949 3951 3955 3957 3958 3961 3963 3965 3968 3970 3974 3980 3983 3984 3985 3986 3987 3988 3992 3996 3998 3999 4000 4004 4005 4009 4011 4012 4013 4015 4016 4020 4021 4024 4027 4028 4030 4031 4032 4033 4034 4035 4036 4037 4039 4042 4045 4046 4047 4053 4057 4068 4069 4071 4075 4078 4079 4084 4085 4090 4091 4093 4094 4097 4099 4100 4102 4103 4104 4105 4106 4107 4108 4109 4110 4113 4114 4117 4118 4119 4124 4126 4127 4128 4129 4132 4133 4134 4135 4138 4141 4143 4144 4146 4149 4152 4153 4154 4159 4160 4163 4164 4165 4166 4168 4169 4170 4171 4172 4173 4180 4182 4183 4184 4185 4187 4190 4191 4192 4193 4194 4197 4199 4201 4202 4204 4210 4212 4215 4217 4218 4220 4221 4223 4227 4228 4232 4233 4237 4238 4239 4241 4242 4244 4249 4250 4252 4253 4255 4258 4265 4267 4269 4271 4272 4274 4276 4277 4283 4284 4285 4287 4288 4290 4291 4292 4299 4301 4302 4305 4308 4310 4311 4312 4313 4315 4316 4319 4320 4321 4322 4323 4326 4327 4330 4337 4339 4343 4344 4345 4348 4349 4350 4351 4354 4362 4364 4367 4368 4369 4370 4371 4373 4374 4375 4377 4381 4383 4384 4385 4387 4389 4390 4391 4394 4395 4396 4400 4404 4407 4410 4414 4416 4417 4419 4423 4424 4425 4427 4429 4430 4431 4432 4433 4437 4441 4443 4444 4445 4449 4456 4459 4460 4462 4463 4464 4465 4466 4467 4468 4471 4474 4475 4479 4482 4490 4491 4495 4496 4497 4499 4500 4506 4507 4508 4510 4511 4514 4516 4518 4519 4520 4523 4524 4527 4529 4534 4535 4536 4537 4538 4539 4540 4541 4542 4545 4547 4548 4551 4553 4555 4556 4557 4558 4559 4562 4563 4565 4568 4569 4571 4577 4578 4579 4582 4584 4587 4589 4590 4594 4598 4599 4600 4601 4603 4606 4607 4608 4611 4612 4613 4616 4617 4618 4619 4621 4623 4625 4626 4629 4630 4632 4634 4635 4639 4640 4641 4642 4643 4647 4649 4650 4651 4653 4659 4660 4662 4663 4664 4667 4669 4671 4675 4679 4680 4681 4683 4684 4685 4686 4688 4690 4692 4694 4695 4697 4700 4701 4703 4704 4707 4708 4710 4711 4714 4716 4719 4720 4721 4722 4723 4725 4732 4733 4736 4737 4739 4740 4742 4743 4744 4745 4746 4749 4751 4752 4753 4755 4756 4761 4765 4766 4767 4769 4771 4772 4775 4776 4777 4784 4785 4791 4793 4795 4796 4801 4803 4804 4805 4807 4809 4810 4811 4812 4813 4816 4817 4819 4820 4822 4823 4825 4827 4830 4831 4832 4837 4838 4839 4840 4841 4842 4844 4845 4847 4850 4852 4853 4854 4856 4860 4862 4863 4866 4869 4870 4878 4879 4881 4882 4885 4886 4888 4889 4891 4893 4894 4895 4896 4897 4898 4899 4900 4902 4903 4904 4906 4907 4908 4909 4912 4913 4914 4915 4917 4918 4921 4922 4923 4925 4926 4927 4931 4933 4936 4937 4938 4940 4942 4943 4944 4945 4947 4949 4952 4953 4957 4961 4962 4964 4965 4966 4972 4973 4974 4976 4981 4982 4983 4984 4985 4987 4989 4990 4992 4993 4994 4996 4997 4999 5002 5003 5004 5006 5009 5012 5016 5018 5023 5025 5027 5030 5031 5033 5037 5042 5044 5045 5047 5049 5051 5054 5055 5056 5062 5065 5067 5069 5072 5074 5075 5077 5080 5081 5082 5084 5086 5089 5094 5097 5100 5101 5102 5104 5105 5106 5107 5108 5109 5112 5113 5114 5115 5117 5118 5121 5123 5125 5127 5128 5129 5131 5135 5136 5139 5141 5142 5144 5146 5148 5151 5152 5153 5158 5159 5160 5162 5163 5164 5167 5169 5171 5173 5177 5178 5179 5185 5187 5191 5192 5194 5199 5202 5203 5204 5206 5207 5209 5211 5212 5213 5214 5215 5216 5218 5220 5222 5223 5224 5225 5226 5227 5228 5229 5231 5232 5233 5235 5236 5238 5239 5240 5241 5244 5246 5247 5249 5251 5253 5254 5255 5256 5260 5262 5264 5265 5267 5268 5272 5273 5275 5279 5281 5282 5284 5285 5286 5287 5290 5292 5294 5296 5299 5300 5301 5302 5304 5306 5307 5311 5312 5313 5317 5318 5319 5321 5323 5324 5325 5326 5327 5328 5329 5332 5334 5335 5336 5337 5338 5342 5343 5344 5346 5347 5348 5349 5351 5352 5353 5354 5355 5356 5359 5360 5361 5367 5368 5369 5370 5372 5374 5376 5377 5378 5380 5382 5383 5385 5386 5387 5388 5389 5391 5397 5398 5401 5404 5407 5408 5412 5417 5418 5421 5423 5424 5426 5427 5428 5432 5435 5440 5443 5444 5445 5446 5447 5448 5457 5458 5459 5461 5465 5467 5468 5469 5470 5473 5475 5476 5477 5478 5480 5481 5484 5485 5486 5488 5489 5492 5496 5498 5499 5501 5502 5503 5506 5508 5509 5513 5517 5521 5523 5524 5526 5528 5530 5531 5532 5533 5534 5535 5537 5538 5541 5543 5545 5546 5550 5552 5555 5558 5563 5565 5569 5573 5574 5575 5577 5578 5580 5581 5582 5585 5589 5593 5594 5595 5597 5601 5602 5603 5604 5605 5608 5612 5614 5615 5616 5619 5622 5626 5627 5631 5632 5633 5634 5635 5638 5639 5640 5642 5644 5646 5653 5654 5658 5659 5661 5662 5663 5664 5666 5667 5668 5670 5674 5676 5677 5679 5680 5682 5683 5684 5686 5687 5690 5691 5694 5695 5696 5699 5700 5701 5702 5704 5706 5708 5710 5711 5713 5716 5718 5719 5720 5721 5725 5726 5727 5728 5731 5733 5735 5737 5738 5740 5747 5749 5752 5754 5756 5757 5758 5760 5762 5763 5765 5768 5770 5771 5774 5777 5778 5780 5782 5783 5785 5788 5791 5793 5797 5798 5799 5800 5802 5803 5804 5805 5806 5807 5809 5810 5811 5816 5817 5819 5821 5822 5830 5834 5838 5839 5842 5844 5846 5847 5848 5849 5850 5851 5852 5853 5855 5856 5857 5860 5866 5868 5872 5876 5877 5878 5885 5887 5892 5897 5898 5899 5901 5902 5904 5907 5909 5910 5913 5915 5919 5920 5923 5925 5928 5930 5935 5937 5939 5941 5942 5943 5944 5945 5946 5947 5949 5951 5953 5955 5956 5958 5959 5962 5966 5968 5970 5973 5977 5978 5980 

Outputs:

808995810

你可能感兴趣的:(dp,FFT)