组合数取模学习笔记

组合数取模的话,之前多少会一些,能应付一般的题目,而这次遇到了模数为合数的题目,于是就又来学习了一发.
这次看到了一个比较不错的blog:https://blog.csdn.net/skywalkert/article/details/52553048
在这个blog里,其1.3里的内容,有许多不理解的地方,并且3.2及以后的内容,并没有去研究.
这次主要是get到了用crt解决模数为合数的问题,并且还有与其配套使用的模数为质数的幂的问题.
复习了一下crt,crt就是去按照一个正确且比较方便的方法去构造一个解,并且利用了数在模里模外意义不同.
下面给出解决此类问题的代码以及代码注释:
(此代码对应于具体题目,请读者抓住重点)

#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
const int N=1000010;
int n,x,y,mod,P,p,phi,fac[N],num;
inline int Pow(int x,int y){int ret=1;while(y){if(y&1)ret=(LL)ret*x%P;x=(LL)x*x%P,y>>=1;}return ret;
}
inline int cnt(int n){return n?n/p+cnt(n/p):0;//递归处理n的阶乘里p的个数
}
inline int sum(int n){return n?((LL)(n/P?Pow(fac[P],n/P):1)*fac[n%P]%P*sum(n/p)%P):1;//递归处理n的阶乘里刨去p之后,在模P的意义下的结果//为什么要递归呢?//我们发现,我们预处理的时候,如果预处理的是刨去p的,那么他根本不循环.//因为对于一个含有p的数来说,他刨去p,和他加上P之后再刨去p,是不一样的.//所以说,我们要预处理的是不含p的数的阶乘,也就是说,如果一个数含有p,那就不乘他.//那么我们首先处理的是不含p的,然后去递归含有一个p的,然后是两个的……//这样答案就对了.//这样好骚啊,一开始由于不知道这个操作而错*N……//不过这玩意log^2的吧……
}
//以上两个函数每次都尼玛可以在一开始处理阶乘的时候处理出来……然后就会跑得飞快……
//不过预处理的话,必须要求n较小,但是递归的话,只要n或P中的一个很小就可以了.
#define deal(n,a,b) int a=sum(n),b=cnt(n);
inline int C(int n,int m){if(m>n)return 0;deal(n,a0,b0)deal(m,a1,b1)deal(n-m,a2,b2)b0-=b1+b2;if(b0>=num)return 0;return (LL)a0*Pow(a1,phi-1)%P*Pow(a2,phi-1)%P*Pow(p,b0)%P;
}
inline int calc(){int ret=0,i,a,b,c,d;fac[0]=1;for(i=1;i<=P&&i<=n;++i)fac[i]=(i%p)?(LL)fac[i-1]*i%P:fac[i-1];a=0,b=x,c=(n-y-x)>>1,d=(n+y-x)>>1;while(c>=0){ret=(ret+(LL)C(n,a+b)*C(a+b,a)%P*C(c+d,c)%P)%P;++a,++b,--c,--d;}return ret;
}
int main(){//freopen("rio.in","r",stdin);scanf("%d%d%d%d",&n,&mod,&x,&y);x=std::abs(x),y=std::abs(y);if(n-y-x<0||((x&1)!=((n+y)&1))){puts("0");return 0;}int i,s=mod,ans=0;for(i=2;s>1;++i){if(i*i>s)i=s;if(s%i==0){p=i,P=1,num=0;while(s%p==0)++num,P*=p,s/=p;phi=P/p*(p-1);ans=(ans+(LL)calc()*(mod/P)%mod*Pow(mod/P,phi-1))%mod;}}printf("%d\n",ans);return 0;
}

 

转载于:https://www.cnblogs.com/TSHugh/p/8638050.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aptio2018设置u盘启动_华硕Aptio Setup Utility 2012主板Bios设置U盘启动

电脑在开机的时候&#xff0c;按Esc键&#xff0c;可以选择启动项&#xff0c;然后选择制作好的U盘启动盘即可。如果没有找到U盘启动项&#xff0c;可以在Bios中设置后&#xff0c;重启选择。这篇文章是PE吧给大家带来的华硕Aptio Setup Utility 2012主板Bios设置U盘启动方法教…

静态顺序表的基本操作

#pragma once#define MAX_SIZE 10 typedef unsigned int size_t;typedef int DataType;#include<stdio.h>#include<assert.h>#include<memory.h>#include <stdlib.h>#define MAX 100 typedef struct SeqList{ DataType arr[MAX]; int sz; // 顺序表中有…

kafka分区与分组原理_kafka 基本原理和概念

Kafka系统的角色Broker &#xff1a;一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topictopic&#xff1a; 可以理解为一个MQ消息队列的名字Partition&#xff1a;为了实现扩展性&#xff0c;一个非常大的topic可以分布到多个 broker(即服…

python里类的概念

Python编程中类的概念可以比作是某种类型集合的描述&#xff0c;如“人类”可以被看作一个类&#xff0c;然后用人类这个类定义出每个具体的人——你、我、他等作为其对象。类还拥有属性和功能&#xff0c;属性即类本身的一些特性&#xff0c;如人类有名字、身高和体重等属性&a…

cadence导入dxf文件_Allegro中如何导入DXF文件

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x1. 执行菜单FileImportDXF…出现下面窗体&#xff1a;2. 选择DXF文件3. 选择单位4. Layer conversion file&#xff1a;会自动产生&#xff0c;或选择设置好的文件5. 点击Edit/…

20172329 2017-2018-2 《程序设计与数据结构》实验一报告

20172329 2017-2018-2 《程序设计与数据结构》实验一报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 王文彬 学号&#xff1a;20172329 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年3月21日 必修/选修&#xff1a; 必修 1.实…

all方法 手写promise_试题-手写实现一个 promise.all - 拿OFFER

Promise.all的实现和原理Promise.all 功能&#xff1a;Promise.all(iterable)返回一个新的Promise实例,此实例在iterable参数内素有的Promise都fulfilled或者参数中不包含Promise时&#xff0c;状态变成fulfilled。如果参数中Promise有一个失败rejected &#xff0c;此实例回调…

排序之选择排序:简单选择+堆排序

一、简单选择排序 1、思想&#xff1a;每遍历一次都记住了当前最小&#xff08;大&#xff09;元素的位置&#xff0c;最后仅需一次交换操作即可将其放到合适的位置。与冒泡排序相比&#xff0c;移动数据次数少&#xff0c;节省时间 &#xff0c;性能优于冒泡排序。 2、时间复杂…

ubantu 添加防火墙策略_Ubuntu 14.04 配置iptables防火墙

Ubuntu默认安装是没有开启任何防火墙的&#xff0c;为了服务器的安全&#xff0c;建议大家安装启用防火墙设置&#xff0c;这里推荐使用iptables防火墙.如果MySQL启本地使用,可以不用打开3306端口.# whereis iptables #查看系统是否安装防火墙可以看到:iptables: /sbin/iptable…

VS集成Qt开发入门(简易时间显示)

VS集成Qt开发入门&#xff08;简易时间显示&#xff09;软件开发入门开发环境简单时间显示&#xff08;LcdNumber&#xff09;ui界面设计&#xff08;clock.ui&#xff09;工程文件&#xff08;clock.h&#xff0c;clock.cpp&#xff09;头文件clock.h&#xff1a;源文件clock.…

ps 毛发 边缘_不会抠图怎么办?PS画笔绘制毛发技巧,抠图流程解析

前两期我们讲了一些简单的抠像方法。第一次我们知道了如何在抠像的同时保留人物投影。第二次我们知道了如何利用背景橡皮擦工具进行抠像。以上是一些稍微简单一些的抠图方法&#xff0c;人人都可以轻松办到。今天讲如何利用PS画笔绘制毛发。今天的知识稍微需要点耐心。如何把下…

Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

Tornado 自定义session&#xff0c;与一致性哈希 &#xff0c;基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash import ringcreate_session_id sasd # 随机生成的 session 函数class SessionGen(object):container {}def __init__(self,ha…

基于结构体的二进制文件读写

基于结构体的二进制文件读写项目介绍工程创建结构体的创建写二进制文件结果读二进制文件结果参考文献项目介绍 本次设计是为了提高读写二进制文件的效率&#xff0c;以约定的结构体形式进行读写操作&#xff0c;避免了一个字节一个字节的多次写入读取操作&#xff0c;并且能以…

排序算法-希尔排序

上一篇讲解了简单插入排序算法&#xff0c;以及在其基础上优化的二分插入排序算法&#xff0c;但是每次插入需要按间隔为 1 移动有序区的元素&#xff0c;效率不高&#xff0c;下面我们来介绍一种新的插入排序算法-希尔排序。 算法简介 希尔排序&#xff08;Shell Sort&#xf…

封包时发现的关于QIODevice类write函数的坑

关于QIODevice类write函数的坑问题概述问题部分代码问题解决结论问题概述 这两天在做TCP通信的封包解包协议操作时&#xff0c;不经意间被write函数坑了好久。通过内存复制进行数据封包&#xff0c;在写入socket的时候总是写入一个字节&#xff0c;不能全部写入数据&#xff0…

java c++ python哪个好_程序员学java好还是python语言好 c++又如何

技术程序员学Java、C、Python... 分析对比&#xff0c;到底学什么语言吃香&#xff0c;哪种语言最靠谱&#xff0c;如何学好这些语言呢&#xff1f;几天前&#xff0c;我们在知识上看到这样一个问题&#xff1a;“java&#xff0c;C&#xff0c;Python&#xff0c;走&#xff0…

Qt多文件传输功能实现及方法概述

Qt多文件传输功能实现前言代码实现概述客户端代码实现服务端代码效果展示结论前言 本次设计主要是为了功能上的实现&#xff0c;因此对于ui界面的设计都是怎么简单怎么来的&#xff0c;主要的功能就是实现多个文件的发送与接收&#xff0c;即客户端发送&#xff0c;服务端接收…

jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式.1、架构图2、服务器列表3、搭…

从java到C++入门

C基础知识前言基础前言 当初为了赶一波互联网热潮自学了java&#xff0c;如今因为需要就从java转向C开发&#xff0c;于是就有了java到C入门&#xff0c;每次的学习我都会记录一下C的学习历程。 基础 C对于内存的控制管理比java要有更多要求&#xff0c;因此C对于变量的创建…

wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法

今天WordPress主题站简单介绍一下WordPress系统中用户信息获取方式&#xff0c;今天就讲讲使用接口方式获取WordPress用户信息的方法。接口文件如下&#xff1a;if (POST ! $_SERVER[REQUEST_METHOD]) {header(Allow: POST);header(HTTP/1.1 405 Method Not Allowed);header(Co…