模板和题解

复习了一下 exlucas的模板,结果写挂四次(都没脸说自己以前写过

是该好好反思一下呢~

错的原因如下:

第一次WA:求阶乘的时候忘了递归处理(n/p)!

第二次WA:求阶乘时把p当成循环节了,循环节应该是(p^k)

第三次WA:把循环节改成(p^k)后,干脆把递归处理(n/p)!改成了递归处理(n/(p^k))! (智障

第四次WA:求(p^k)的逆元直接用(p^k)^(mod-2),然而(p^k)不一定是质数,不能用费马小定理,应该用exgcd求逆元

就因为这几个错误花了我两个小时的时间,其实主要原因是自己没想清楚,连exlucas式子都推错,看题解也太心急了没认真看,导致自己反复错。

还有就是自己数论的基础太差,比如第四次错误就想当然以为(p^k)的逆元是它的(mod-2)次方,连费马小定理的条件都忘了

(PS:好像luogu上此题开O2会全T?相同的代码不开O2都过了)

代码:

 #include<bits/stdc++.h>
using namespace std;
#define N 107
#define ll long long
ll p2(ll x,ll mod)
{
return x*x%mod;
}
ll pw(ll x,ll p,ll mod)
{
return p?p2(pw(x,p/,mod),mod)*(p&?x:)%mod:;
}
ll fun(ll n,ll p)
{
if(n<p)return ;
return fun(n/p,p)+n/p;
}
ll exfac(ll n,ll p,ll mod)
{
if(n==)return ;
ll i,mul=;
for(i=;i<=mod;i++)
if(i%p!=)mul=mul*i%mod;
ll ans=pw(mul,n/mod,mod);
ll rest=n%mod;
for(i=;i<=rest;i++)
if(i%p!=)ans=ans*i%mod;
return ans*exfac(n/p,p,mod)%mod;
}
ll exgcd(ll x,ll y,ll &a,ll &b)
{
ll z;
return y?(z=exgcd(y,x%y,b,a),b-=a*(x/y),z):(a=,b=,x);
}
ll getinv(ll a,ll p)
{
ll x,y;
exgcd(a,p,x,y);
x=(x%p+p)%p;
}
ll exlucas(ll n,ll m,ll p,ll mod)
{
ll ans=exfac(n,p,mod);
ans=ans*getinv(exfac(m,p,mod),mod)%mod;
ans=ans*getinv(exfac(n-m,p,mod),mod)%mod;
ll times=fun(n,p)-fun(m,p)-fun(n-m,p);
ans=ans*pw(p,times,mod)%mod;
return ans;
}
ll a[N],b[N],cnt;
void getans(ll n,ll m,ll p)
{
ll t=sqrt(p),i,x=p;
for(i=;i<=p;i++)
{
if(x%i==)
{
ll mod=;
while(x%i==)x/=i,mod*=i;
ll res=exlucas(n,m,i,mod);
//printf("%lld\n",res);
a[++cnt]=res,b[cnt]=mod;
}
}
}
int main()
{
ll n,m,p,i;
scanf("%lld%lld%lld",&n,&m,&p);
getans(n,m,p);
ll ans=;
for(i=;i<=cnt;i++)
{
ll M=p/b[i];
ll x=a[i]*M%p*getinv(M,b[i])%p;
ans=(ans+x)%p;
}
printf("%lld\n",ans);
return ;
}

exlucas易错反思的更多相关文章

  1. JavaScript易错知识点整理

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  2. JavaScript 易错知识点整理

    本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES ...

  3. Java五道输出易错题解析(避免小错误)

    收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class Integ ...

  4. 细节!重点!易错点!--面试java基础篇(二)

    今天来给大家分享一下java的重点易错点第二部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断 ...

  5. 细节!重点!易错点!--面试java基础篇(一)

    今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在ma ...

  6. [SQLXML]FOR XML语法导出XML的易错之处

    原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...

  7. JavaScript易错点转载

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  8. PHP数据访问易错点(20161030)

    易错点: 1.造对象的时候括号里面的参数 写错了 $db = new MySQLi("localhost","root","789",&qu ...

  9. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)

    本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...

随机推荐

  1. Java自学-接口与继承 隐藏

    Java中的方法隐藏 与重写类似,方法的重写是子类覆盖父类的对象方法 隐藏,就是子类覆盖父类的类方法 步骤 1 : 父类 父类有一个类方法 :battleWin package charactor; ...

  2. JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象)

    JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象) 一丶什么是BOM ​      B ...

  3. kylin Build过程问题排查:17 Step Name: Build Cube In-Mem

    Kylin Build执行到底17步时报错:17 Step Name: Build Cube In-Mem  ,错误截图如下: 点左下角的MRJob图标,打开查看错误信息: 从MRJob中的描述中可见 ...

  4. Beego 学习笔记11:文件的上传下载

    文件的上传和下载 1->文件的上传 文件的上传,采用的是uploadify.js这个插件. 本事例实现的是上传图片文件,其他的文件上传也一样. 2->文件的下载 文件的下载有两个实现的方式 ...

  5. 剑指前端(前端入门笔记系列)——BOM

    BOM ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心,BOM提供了很多对象,用于访问浏览器的功能,这些 ...

  6. 你可能还不知道的关于JavaScript类型的细节?

    类型 七种类型: Undefined Null Boolean String Number Symbol Object Undefined.Null 阅读问题:为什么有的编程规范要求使用void 0 ...

  7. jsonserver的安装及启动

    JsonServer 主要的作用就是搭建本地的数据接口,创建json文件,便于调试调用 是一个 Node 模块,运行 Express 服务器,可以指定一个 json 文件作为 api 的数据源 官网: ...

  8. Android 使用traceView

    Android在做性能优化的时候需要使用traceView进行检测,traceView可以详细的记录下线程执行的时间让我们在做优化的时候可以清楚优化哪些内容.首先我们需要使用这个traceView,在 ...

  9. Nexus6p手机root和安装xposed

    进行root前需要两个前提条件 解锁OEM 进入开发者选项:设置-〉关于-〉一直点版本号会出现,usb调试打开 手机连接pc命令行输入: adb reboot bootloader 进入bootloa ...

  10. CDA数据分析【第二章:数据收集与导入】

    一.概述 数据是对我们所研究现象的属性和特征的具体描述,在分析数据前必须要做的工作就是收集数据.按照存储形式可以将数据划分为结构化数据.非结构化数据和半结构化数据. 1.结构化数据 能够用数据或统一的 ...