| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1599 人关注过本帖
标题:请求老师验证一下这个VC程序能不能运行?
只看楼主 加入收藏
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
结帖率:100%
收藏
 问题点数:0 回复次数:3 
请求老师验证一下这个VC程序能不能运行?
这是个快速数论变换程序就是NTT:
下面这个是定义
#define g 3//模数的原根
#define mod 998244353//通常情况下的模数

int pow(int x,int y)//快速幂
{
    ll z=1ll*x,ans=1ll;
    for (;y;y/=2,z=z*z%mod)if (y&1)ans=ans*z%mod;//注意精度
    return (int)ans%mod;
}

下面是NTT板子,由FFT稍改了几下就成了(原文是这么说的)
inline void ntt(int a[],int len,int inv)
{
    int bit=0;
    while ((1<<bit)<len)++bit;
    fo(i,0,len-1)
    {
        rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
        if (i<rev[i])swap(a[i],a[rev[i]]);
    }//前面和FFT一样
    for (int mid=1;mid<len;mid*=2)
    {
        int tmp=pow(g,(mod-1)/(mid*2));//原根代替单位根
        if (inv==-1)tmp=pow(tmp,mod-2);//逆变换则乘上逆元
        for (int i=0;i<len;i+=mid*2)
        {
            int omega=1;
            for (ll j=0;j<mid;++j,omega=omega*tmp%mod)
            {
                int x=a[i+j],y=omega*a[i+j+mid]%mod;
                a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;//注意取模
            }
        }//大体和FFT差不多
    }
}

请老师有空的时候看看,欢迎指点!谢谢您!
搜索更多相关主题的帖子: tmp int for mid 老师 
2020-05-24 18:37
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
收藏
得分:0 
据说NTT可以用于大整数的快速乘法除法运算,下面的话是原文的说明:
和FFT一样,NTT也只能处理n为2的次幂的多项式
NTT调用和FFT一模一样,注意 long long和除法都变成乘逆元
逆NTT变换后每一项系数乘上多项式长度的逆元即可

请问老师,NTT如何用于快速乘法除法运算呢?
2020-05-24 18:41
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
收藏
得分:0 
顶一下,希望各位老师给与指导!谢谢您!
2020-06-06 12:38
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
收藏
得分:0 
我不懂vc请求老师给予指导,谢谢!
2020-06-18 10:22
快速回复:请求老师验证一下这个VC程序能不能运行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045522 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved