卢卡斯定理

注意特判底数和模数相等的情况

http://www.cnblogs.com/poorpool/p/8532809.html

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int MOD = 999911659;
ll n, g, p[5] = {0, 2, 3, 4679, 35617}, ans[5], fac[100000], ni[100000];
ll exgcd(ll a, ll b, ll & x, ll & y ){
if(!b) {
x = 1; y = 0;
return a;
}
ll t = exgcd(b, a % b, y, x);
y -= a / b * x;
return t;
}
ll getni(ll x, ll p) {
ll a, b;
exgcd(x, p, a, b);
(a += p) %= p;
return a;
}
ll lucas(ll a, ll b, ll p) {
if(a < b) return 0;
if(a < p) return fac[a] * ni[b] * ni[a - b] % p;
else return lucas(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}
void work(int x) {
memset(fac, 0, sizeof(fac));
memset(ni, 0, sizeof(ni));
fac[1] = fac[0] = ni[0] = ni[1] = 1;
for(int i = 2; i < p[x]; i++) fac[i] = fac[i - 1] * i % p[x];
for(int i = 2; i < p[x]; i++) ni[i] = (p[x] - p[x] / i) * ni[p[x] % i] % p[x];
for(int i = 2; i < p[x]; i++) (ni[i] *= ni[i - 1]) %= p[x];
ll i = 1ll;
for( ; i * i < n; i++) {
if(n % i == 0) {
ans[x] += lucas(n, i, p[x]);
//cout << ans[x] << endl;
ans[x] += lucas(n, n / i, p[x]);
//cout << ans[x] << endl;
ans[x] %= p[x];
//cout << ans[x] << endl;
}
}
if(i * i == n) ans[x] += lucas(n, i, p[x]);
//cout << ans[x] << endl;
//cout << endl;
ans[x] %= p[x];
}
ll CRT() {
ll M = MOD - 1;
ll rt = 0ll;
for(int i = 1; i <= 4; i++) {
rt += ans[i] * getni(M / p[i], p[i]) * (M / p[i]) % M;
}
//cout << rt << endl;
return rt % M;
}
ll quick_mod(ll a, ll k) {
ll ans = 1ll;
while(k) {
if(k & 1ll) (ans *= a) %= MOD;
(a *= a) %= MOD;
k >>= 1;
}
return ans;
}
int main() {
cin >> n >> g;
if(g == MOD) {printf("0\n");return 0;}
for(int i = 1; i <= 4; i++) {
work(i);
//cout << ans[i] << endl;
}
cout << quick_mod(g, CRT()) << endl;
return 0;
}

最新文章

  1. hadoop 2.4 遇到的问题
  2. MSSQL 分页
  3. 备份Mysql数据库BAT脚本
  4. paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning
  5. SNAT,是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址
  6. 配置ogg异构oracle-mysql(3)目的端配置
  7. Codeforces 677E Vanya and Balloons(DP + 一些技巧)
  8. Android 圆形ProgressBar风格设置
  9. button与submit
  10. Reactor模式,或者叫反应器模式
  11. UML图示
  12. 有意思的数学题:Trapping Rain Water
  13. oracle 使用基本问题
  14. Krita编译和旧版本下载
  15. Android TextWatcher应用实例
  16. blend
  17. setTimeout与setInterval的区别
  18. ECC椭圆曲线详解(有具体实例)
  19. Python 创建递归文件夹
  20. mac IntelliJ Idea添加schema和dtd约束提示

热门文章

  1. C08 C语言预处理命令
  2. javaweb基础(1)_入门
  3. 关于UINavigationController的一些技巧
  4. pythonnet-网络编程(1)
  5. cmake命令 安装、用法简介
  6. Linux之crond 服务介绍
  7. strcpy和strncpy用法和区别
  8. ogre3D学习基础9 -- 光源程序实例
  9. Leetcode12---&gt;Integer to Roman(整数转换为罗马数字)
  10. bat 中的特殊符号输出问题