博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AcWing - 求组合数 III(lucas&逆元)
阅读量:1999 次
发布时间:2019-04-28

本文共 1177 字,大约阅读时间需要 3 分钟。

题目链接:

时/空限制:1s / 64MB

题目描述

给定n组询问,每组询问给定三个整数a,b,p,其中p是质数,请你输出C_a^b\ mod\ p的值。

输入格式

第一行包含整数n。

接下来n行,每行包含一组a,b,p。

输出格式

共n行,每行输出一个询问的解。

数据范围

1≤n≤20,

1≤b≤a≤10^18,
1≤p≤10^5,

输入样例

3

5 3 7
3 1 5
6 4 13

输出样例

3

3
2

解题思路

题意:C_a^b\ mod\ p的值。

思路:

  • 100000组, 1 <= b <= a <= 2000, 递推 -> O(N^2).
  • 10000组, 1 <= b <= a <= 10^5, 预处理 -> O(NlogN).
  • 20组, 1 <= b <= a <= 10^18, p <= 10^5, 卢卡斯定理(lucas)
    C_n^m\ \%\ p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\ \%\ p

Accepted Code:

/*  * @Author: lzyws739307453  * @Language: C++  */#include 
using namespace std;typedef long long ll;int Fast_Power(int a, int b, int p) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % p; a = 1ll * a * a % p; b >>= 1; } return res;}int Com_Num(int a, int b, int p) { int res = 1; for (int i = 1, j = a; i <= b; i++, j--) res = 1ll * res * j % p * Fast_Power(i, p - 2, p) % p; return res;}int lucas(ll a, ll b, int p) { if (a < p && b < p) return Com_Num(a, b, p); return 1ll * Com_Num(a % p, b % p, p) * lucas(a / p, b / p, p) % p;}int main() { int t; scanf("%d", &t); while (t--) { int p; ll a, b; scanf("%lld%lld%d", &a, &b, &p); printf("%d\n", lucas(a, b, p)); } return 0;}

转载地址:http://rubtf.baihongyu.com/

你可能感兴趣的文章
CBV之详解
查看>>
vue之cli脚手架项目中组件的使用
查看>>
vue之单表输入绑定
查看>>
同源策略与Jsonp
查看>>
vue之修饰符
查看>>
csrf_token之全局认证与局部认证
查看>>
CBV流程之View源码解析
查看>>
让sublime text3支持Vue语法高亮显示
查看>>
AJAX之三种数据传输格式详解
查看>>
rest_framework之规范详解 00
查看>>
Django之ContentType详解
查看>>
RESTful 规范
查看>>
rest_framework框架的认识
查看>>
什么是JWT
查看>>
scrapy-redis的使用与解析
查看>>
Python的垃圾回收机制
查看>>
Flask详解
查看>>
python中filter(),map()和reduce()的用法及区别
查看>>
一个基于百度云和图灵的人工智能(智障)程序
查看>>
Flask-SQLAlchemy
查看>>