礼物
  • 题意:

    • 求$$C(n,m)\ %\ p$$
    • \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\)
  • 注意到若$$p=\prod_{i=1}{k}{p_i}{c_i},则\forall i\in [1..k]{p_i}^{c_i}\le 10^5.$$

  • 于是有一个经典套路就是,求出\(k\)组\(A_i=C(n,m)\% {p_i}^{c_i}\),最后用中国剩余定理求解.

  • 注意到若中国剩余定理求出一组特解为\(Ans\),则\((Ans+kp)\)为其通解.

  • 由于\(p\)不保证为质数,所以我们需要对\(C(n,m)\)拆式子,然后把含\(p\)的与不含\(p\)的质因子分开算.

  • 于是问题转化为求\(n!\),我们以\(p^c\)个数为一组,不难发现,把含\(p\)质因子的数筛出去后每一组的乘积在模\(p^c\)意义下是一样的.

  • 这个证明很显然,因为每一组都可以表示为\((k*p^c+1,k*p^c+2,\cdots,(k+1)*p^c)\).

  • 于是发现含有\(p\)的质因子又是一个阶乘.

  • 所以分治处理.

  • 注意这里对于模数非质数的求逆元方法:

  • 我们要求\(x\)关于\(m\)的逆元,实质上就是\(ax + km = 1\)的解.

  • 然后我们可以求得这个\(a\),用拓展\(gcd\)即可.

ll Exgcd(L a, L b, L &x, L &y) {
if (!b) { x = 1, y = 0; return a; }
L d = Exgcd(b, a % b, x, y), z = x;
x = y, y = z - y * (a / b); return d;
} //拓欧 ll CALC(L st, L en, L k) { L s = 1;
F(i, st, en) if (i % sta[k].p) s = (s * i) % sta[k].up;
return s;
} ll calc(L n, L k) {
if (n <= sta[k].p) return CALC(1, n, k);
L k1 = calc(n / sta[k].p, k); //分治求解
L k2 = CALC(1, min(sta[k].up - 1, n), k); //每sta[k].up个分一组,这是一个循环节
if (n > sta[k].up) {
L k3 = CALC((n / sta[k].up) * sta[k].up + 1, n, k); //计算循环节余剩的
return (k1 * ksm(k2, n / sta[k].up, sta[k].up) * k3) % sta[k].up;
}
else return (k1 * k2) % sta[k].up;
} ll count(L n, L p) { return n < p ? 0 : n / p + count(n / p, p); } //分治计算含p质因子个数 ll Inv(L t, L p) {
L d, x, y; d = Exgcd(t, p, x, y); //求逆元
return (x % p + p) % p;
} ll C(L x, L y) {
L ss = 0;
F(i, 1, cnt) {
L s1 = calc(x, i), s2 = (calc(y, i) * calc(x - y, i)) % sta[i].up, tot; //计算x!/y!(x-y)!
s1 = s1 * Inv(s2, sta[i].up) % sta[i].up; //与sta[i].up互质,所以用拓欧求逆元.
tot = count(x, sta[i].p) - count(y, sta[i].p) - count(x - y, sta[i].p); //计算含p质因子个数
s1 = s1 * ksm(sta[i].p, tot, sta[i].up) % sta[i].up; //快速幂一下
G[i] = {s1, sta[i].up}; //一组方程
}
F(i, 1, cnt) {
L Mi = p / sta[i].up;
ss = (ss + ((G[i].a * Mi % p) * Inv(Mi, G[i].mo))) % p; //构造一组特解
}
return ss == 0 ? p : (ss % p + p) % p; //通解
}
  • 此题是很好的思维+数论模板题.

礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)的更多相关文章

  1. 【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)

    题意:给出 A%9973 和 B,求(A/B)%9973的值. 解法:拓展欧几里德求逆元.由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元. 对于 B ...

  2. 扩展gcd求逆元

    当模数为素数时可以用费马小定理求逆元. 模数为合数时,费马小定理大部分情况下失效,此时,只有与模数互质的数才有逆元(满足费马小定理的合数叫伪素数,讨论这个问题就需要新开一个博客了). (对于一个数n, ...

  3. 拓展gcd求不定方程通解

    void gcd(LL a,LL b,LL &d,LL &x,LL &y){ ){d=a;x=;y=;return;} gcd(b,a%b,d,x,y); int t=x; x ...

  4. 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍

    1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...

  5. BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd

    题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...

  6. 扩展中国剩余定理(扩展CRT)详解

    今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...

  7. codeforces 492E. Vanya and Field(exgcd求逆元)

    题目链接:codeforces 492e vanya and field 留个扩展gcd求逆元的板子. 设i,j为每颗苹果树的位置,因为gcd(n,dx) = 1,gcd(n,dy) = 1,所以当走 ...

  8. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)

    gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...

  9. 模板—中国剩余定理+拓展GCD

    int exgcd(int a,int b,int &x,int &y) { ) { x=,y=; return a; } int gcd=exgcd(b,a%b,x,y); int ...

随机推荐

  1. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...

  2. Kafka 特性

    Kafka 特性 标签(空格分隔): Kafka 支持多个生产者 多个生成者连接Kafka来推送消息,这个和其他的消息队列功能基本上是一样的 支持多个消费者 Kafka支持多个消费者来读取同一个消息流 ...

  3. 使用mybatis操作AS400数据库

    先简单说一下怎么使用[jt400.jar]连接AS400上的DB2数据库. ※ jt400.jar资源,如果有安装AS400客户端的话,参考IBM官网 ※ http://www-01.ibm.com/ ...

  4. Java调用windows命令

    JAVA调用windows的cmd命令 用起来会让程序变得更加简洁明了,非常实用. 核心就是使用 Runtime类. cmd的xcopy就有很强大的文件夹,文件处理功能. 下面就以xcopy来说明,如 ...

  5. 三数之和的golang实现

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  6. kernel笔记——中断

    cpu与磁盘.网卡.键盘等外围设备(相对于cpu和内存而言)交互时,cpu下发I/O请求到这些设备后,相对cpu的处理能力而言,磁盘.网卡等设备需要较长时间完成请求处理. 那么在请求发出到处理完成这段 ...

  7. mmap:速度快+整块操作

    mmap使得可以将设备内存映射到用户空间,从而使得用户程序获得访问硬件的能力,mmap的动作需要由内核中的驱动来实现.在使用mmap映射后,用户程序对给定范围的内存的读写就变成了对设备内存的读写,也就 ...

  8. service docker start后docker stop/waiting的解决方法

    在某次强行对机子断电后,再开机后发现docker没启动 运行service docker start显示docker start/running, process xxxx,之后不一会儿就停止了, 再 ...

  9. SQL SERVER数据库修改是否区分大小写(转载)

    昨天去客户,发现程序无法应用,跟踪错误提示,提示的大致意思是“数据库表名和数据库字段名不存在”.查询后发现是SQL Server数据库设置了区分大小写的缘故(一般安装时,Oracle的正确安装下是默认 ...

  10. spring+struts2+hibernate框架搭建(Maven工程)

    搭建Spring 1.porm.xml中添加jar包 <!-- spring3 --> <dependency> <groupId>org.springframew ...