当前位置: 首页 > news >正文

一名提高选手的数论之路(二)

1.乘法逆元(inv)两种求法:
First:(满足p为质数且a与p互质才可以使用)
根据费马小定理:apa(modp)
可得ap2a1(modp)
由此可知,ap2modp即是a在模p意义下的逆元
然而ap2可以轻易用快速幂算出
Second:(无条件)
通过扩展欧几里得算法来求:exgcd(a,p,x,y)
如此调用,x便是求得的a在模p意义下的逆元
不要问我为什么,我不想(zhi)说(dao)
记得答案是这样的(x+p)%p,因为要防止求出负数
代码就不用了吧。


2.在O(n)内求前n个逆元:
这是偶然从一个人的博客里看见的。
首先inv[1]=1
然后inv[i]=(M-M/i)*inv[M%i]%M
如此从2一直递推到n就可以了。
具体证明可以看出处
代码很简单:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int n,M;
int inv[100001];
int main(){
    scanf("%d %d",&n,&M);
    inv[1]=1;
    for(int i=2;i<=n;i++){
        inv[i]=(M-M/i)*inv[M%i]%M;
    }
    for(int i=1;i<=n;i++){
        printf("%d ",inv[i]);
    }
    return 0;
}

3.Lucas定理:(注意,在算阶乘数组的时候,必须从a[0]开始初始化,不然有可能错。)
这个定理是用来求大组合数取模的结果的。
具体证明呀什么的可以自己百度。
我这里给个公式:
C(n,m)=C(n%p,m%p)*C(n/p,m/p)
然后在计算的时候,只要递归地去计算右半部分就可以了,左半部分可以预处理出阶乘直接算,记得边算边取模就好。

//这是洛谷的模板题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll ksm(ll a,ll b,ll p){
    a%=p;
    ll ans=1;
    while(b){
        if(b&1){
            ans=(ans*a)%p;
        }
        a=a*a%p;
        b>>=1;
    }
    return ans;
}
ll a[100001];
ll cm(ll n,ll m,ll p){
    if(m>n)return 0;
    return (a[n]*(ksm(a[m],p-2,p))%p*(ksm(a[n-m],p-2,p))%p);
}
ll lucas(ll n,ll m,ll p){
    if(m==0)return 1;
    return (cm(n%p,m%p,p)%p*lucas(n/p,m/p,p)%p);
}
int main(){
    int T;
    scanf("%d",&T);
    for(int o=1;o<=T;o++){
        ll n,m,p;
        scanf("%lld%lld%lld",&n,&m,&p);
        memset(a,0,sizeof(a));
        a[0]=1;
        for(int i=1;i<=100000;i++){
            a[i]=(a[i-1]*i)%p;
        }
        printf("%lld\n",lucas(n+m,n,p));
    }
    return 0;
}

4.中国剩余定理(CRT):
用来求线性同余方程组,常用作合并答案
具体自己百度,我也没很弄懂,只是背了公式。

//代码未经测试,极有可能出错,仅供参考
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1;
        y=0;
        return a;
    }
    ll q=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return q;
}
ll inv(ll a,ll p){
    ll x,y;
    exgcd(a,p,x,y);
    return (x+p)%p;
} 
ll CRT(int n,ll *a,ll *m){
    ll M=1;
    for(int i=1;i<=n;i++){
        M*=m[i];
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        ll t=M/m[i];
        ll x=inv(t,m[i]);
        ans=(ans+a[i]*t*x)%M;
    }
    return (ans+M)%M;
}
int n;
ll a[100001];
ll m[100001];
int main(){

    return 0;
}

好多算法我还在看还没搞懂,之后发吧,比如什么扩展lucas

转载于:https://www.cnblogs.com/stone41123/p/7581279.html

相关文章:

  • jQuery学习笔记(二)
  • 展望2017 Commvault支招企业如何应对数据洪流
  • 字符画生成
  • ECS上自建Redis服务压测报告
  • linux-grep、find、ps命令
  • (转载)OpenStack Hacker养成指南
  • 利用Logstash插件进行Elasticsearch与Mysql的数据
  • fastjson快速上手(4)
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Python Configparser模块读取、写入配置文件
  • Oracle JET mobile cordove navigator.app对象
  • TFS 报错解决方案:tf400324
  • 欧洲某领先银行利用大数据实现创新转型
  • Nginx多层代理配置
  • 嗜血法医第八季/全集Dexter 8迅雷下载
  • JavaScript-如何实现克隆(clone)函数
  • 2017届校招提前批面试回顾
  • flutter的key在widget list的作用以及必要性
  • js递归,无限分级树形折叠菜单
  • log4j2输出到kafka
  • Redis的resp协议
  • SpingCloudBus整合RabbitMQ
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue官网教程学习过程中值得记录的一些事情
  • 反思总结然后整装待发
  • 分享几个不错的工具
  • 给初学者:JavaScript 中数组操作注意点
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 如何在 Tornado 中实现 Middleware
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ionic入门之数据绑定显示-1
  • 如何正确理解,内页权重高于首页?
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #vue3 实现前端下载excel文件模板功能
  • (10)STL算法之搜索(二) 二分查找
  • (4)事件处理——(7)简单事件(Simple events)
  • (k8s中)docker netty OOM问题记录
  • (备忘)Java Map 遍历
  • (第二周)效能测试
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (全注解开发)学习Spring-MVC的第三天
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *2 echo、printf、mkdir命令的应用
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net MVC4 上传大文件,并保存表单
  • .net 后台导出excel ,word
  • .NET开发人员必知的八个网站
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET委托:一个关于C#的睡前故事
  • @SuppressWarnings注解