zoukankan      html  css  js  c++  java
  • luoguP1919 A*B Problem升级版 ntt

    luoguP1919 A*B Problem升级版

    链接

    luogu

    思路

    ntt模板题

    代码

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=3e5+7,mod=998244353;
    int n,a[N],b[N],limit=1,l,r[N];
    ll q_pow(ll a,int b) {
        ll ans=1;
        while(b) {
            if(b&1) ans=ans*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return ans;
    }
    void ntt(int *a,int type) {
        for(int i=0;i<limit;++i)
            if(i<r[i]) swap(a[i],a[r[i]]);
        for(int mid=1;mid<limit;mid<<=1) {
            int Wn=q_pow(3,(mod-1)/(mid<<1));
            for(int i=0;i<limit;i+=(mid<<1)) {
                for(int j=0,w=1;j<mid;++j,w=1LL*w*Wn%mod) {
                    int x=a[i+j],y=1LL*w*a[i+j+mid]%mod;
                    a[i+j]=(x+y)%mod;
                    a[i+j+mid]=(x+mod-y)%mod;
                }
            }
        }
        if(type==-1) {
            reverse(&a[1],&a[limit]);
            int down=q_pow(limit,mod-2);
            for(int i=0;i<=limit;++i) a[i]=1LL*a[i]*down%mod;
        }
    }
    int main() {
        scanf("%d",&n);
        n--;
        for(int i=n;i>=0;--i) scanf("%1d",&a[i]);
        for(int i=n;i>=0;--i) scanf("%1d",&b[i]);
        while(limit<=n+n) limit<<=1,l++;
        for(int i=0;i<=limit;++i)
            r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
        ntt(a,1),ntt(b,1);
        for(int i=0;i<=limit;++i) a[i]=1LL*a[i]*b[i]%mod;
        ntt(a,-1);
        for(int i=0;i<=limit;++i)
            a[i+1]+=a[i]/10,a[i]%=10;
        int len=limit;
        while(!a[limit]&&limit) limit--;
        while(limit>=0) printf("%d",a[limit--]);
        return 0;	
    }
    
  • 相关阅读:
    润乾报表之图片导出不显示
    润乾报表之前言
    ActionSheet & alertView
    OC基础知识
    状态栏的设置
    计算机的存储单位
    autoreleass的基本使用
    图片选择器(UIImagePickerController)
    Foundation
    Block
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/10695665.html
Copyright © 2011-2022 走看看