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的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
随机推荐
- 整理:WPF中Binding的几种写法
原文:整理:WPF中Binding的几种写法 目的:整理WPF中Bind的写法 <!--绑定到DataContext--> <Button Content="{Bindin ...
- SQL Server中如何把 科学记数法字符串 变为 数字字符串
当我们将Excel的数据导入SQL Server时,如果用SQL Server的字符串类型(VARCHAR和NVARCHAR等)来存储从Excel导入的数字,有时候这些数字会变成科学记数法字符串(例如 ...
- C#DataTable使用方法详解
在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 1.添加引用 1 2 ...
- 整理下log4net日志
今天整理了下log4net日志,记录一下... 日志是一个系统排错的重要组成,有在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogg ...
- 修改dedecms 一些配置cfg_softname,cfg_soft_enname,cfg_soft_devteam
1.找到include 中的common.inc.php 直接修改就可以了.
- chrome安装插件
看了很多的解决办法,也试了很多种,有的有点用,有的只能用一次,最后成功了,在这里总结一下 一.首先下载 很多人下载的都ctx格式的,然后拖进去安装,用了一次就崩溃了,主要还是安装方式不对,一般需要将下 ...
- 2019 创蓝253java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.创蓝253等公司offer,岗位是Java后端开发,因为发展原因最终选择去了创蓝253,入职一年时间了,也成为 ...
- PHPSocket.IO知识学习整理
一.服务端和客户端连接 1.创建一个SocketIO服务端 <?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\ ...
- spring boot如何处理异步请求异常
springboot自定义错误页面 原创 2017年05月19日 13:26:46 标签: spring-boot 方法一:Spring Boot 将所有的错误默认映射到/error, 实现Err ...
- .Net core 使用swagger进行Api管理
上次我们讲过如何在swagger上隐藏接口,众所周知,swagger是一个强大的api文档工具,可以帮助我们记录文档并且测试接口,也是一个可视化操作接口的工具. 那么如果我们写的接口非常多的时候怎么办 ...