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的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
随机推荐
- Socker编程之UDP
一:socket简介 1. 不同电脑上的进程之间如何通信 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起! 在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的. ...
- Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁
Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...
- Texture(ASDK)、ComponentKit、LayoutKit、YogaKit
YogaKit 最轻量,改动量最小,目的最纯粹,同时也最类似于使用 frame ,需要自己造一波在 UITableView 中使用的轮子(各类 frame 结果缓存方案).同类的备选方案是 FlexB ...
- div css字间距
div:nth-child(1){ color: #FFFFFF; font-size: 13px; font-weight: bold; margin-bottom: 25px; letter-sp ...
- 15 Android系统安全(简要)
Android的用户和第三方软件,Android组件和数据安全 手机root后的问题:1.系统不稳定,2.病毒入侵,3.数据泄露 Root原理: Root分两类:1.临时root,2.永久root R ...
- pandas 之 特征工程
import numpy as np import pandas as pd So far(到目前为止) in this chapter we've been concerned with rearr ...
- Git拉取Gitlab上的代码时,报128的解决方法
今天拉取gitlab上的代码时出现错误,一直返回128 首先我们确定我们在存储库上有没有权限,然后我就去项目中的 Members上看是否有权限,然后发现也是有的. 然后克隆的时候发现输入一万遍密码都还 ...
- 【Git版本控制】Git初始化一个仓库
git init //初始化一个本地库 git add -A//将所有的文件添加到暂存区 git commit -m “首次提交” //将暂存区的文件提交到版本库 git remote add ori ...
- prometheus学习系列十一: Prometheus exporter详解
exporter详解 前面的系列中,我们在主机上面安装了node_exporter程序,该程序对外暴露一个用于获取当前监控样本数据的http的访问地址, 这个的一个程序成为exporter,Expor ...
- docker安装常见应用
1.emqx #!/bin/bash docker stop emqttd-docker-v2.3.11 docker rm emqttd-docker-v2.3.11 docker run -tid ...