exlucas易错反思
复习了一下 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易错反思的更多相关文章
- JavaScript易错知识点整理
前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...
- JavaScript 易错知识点整理
本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES ...
- Java五道输出易错题解析(避免小错误)
收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class Integ ...
- 细节!重点!易错点!--面试java基础篇(二)
今天来给大家分享一下java的重点易错点第二部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断 ...
- 细节!重点!易错点!--面试java基础篇(一)
今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在ma ...
- [SQLXML]FOR XML语法导出XML的易错之处
原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...
- JavaScript易错点转载
前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...
- PHP数据访问易错点(20161030)
易错点: 1.造对象的时候括号里面的参数 写错了 $db = new MySQLi("localhost","root","789",&qu ...
- 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
随机推荐
- SpringBoot中使用@scheduled定时执行任务需要注意的坑
spring boot: 计划任务@ EnableScheduling和@Scheduled @Scheduled中的参数说明 @Scheduled(fixedRate=2000):上一次开始执行时间 ...
- ClassPathBeanDefinitionScanner 说明
Spring 工具类 ClassPathBeanDefinitionScanner 组件Bean定义扫描https://blog.csdn.net/andy_zhang2007/article/det ...
- SQL server中常用sql语句
--循环执行插入10000条数据 declare @ID intbeginset @ID=1 while @ID<=10000begininsert into table_name values ...
- Google Chrome 浏览器JS无法更新解决办法
JS无法更新原因: 浏览器为了加载快,默认是按照自定规则更新缓存,非实时更新. 我们在开发的时候,JS变动很快,需要即时让浏览器加载最新文件,也就是禁用浏览器缓存 (1)使用F12进入开发者模式,找到 ...
- RSA公钥加密私钥解密
公司的项目需要电科院测评,必须保证数据的完整性和保密性,为这两个特性不得不搞个RSA+SHA1加密. 页面处理过程: 每次登录前,先向后端发送请求,由RSA生成一对公钥和私钥,获取公钥中的模modul ...
- python 中 try,except,finally 的执行顺序
写代码的时候发现了好玩的事情,常常作为终止的 return 语句并不总是能够立刻跳出函数 def A(): try: for i in range(10): if i == 5: return pri ...
- 版本控制器:Git-的使用
版本控制器:Git # 达到多人协同开发的目的 安装 """ 1.下载对应版本:https://git-scm.com/download 2.安装git:在选取安装路径的 ...
- PAT 1003我要通过!
PAT 1003 我要通过! 答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出&qu ...
- Beego 学习笔记12:文件的操作
文件的操作 1> 此事例操作的是text文件 2> 文件的操作有读取text内容,将内容写入到文件中,删除文件,创建文件 3> 新建一个控制器,名为rwfil ...
- python之路第三天
2018年 7月 13 日 while循环语句: 输出1-5的数 s = 1 whlie s < 6: print(s) 用while循环输入 1 2 3 4 5 6 8 9 10 while ...