1951: [Sdoi2010]古文字猪
1951: [Sdoi2010]古代猪文
链接:Click Here~
题目:
一道非常好的组合数学题。!!。题目非常长。只是就以下几段话实用。
iPig认为仅仅要符合文献,每一种能整除N的k都是有可能的。他打算考虑到全部可能的k。显然当k等于某个定值时,该朝的猪文文字个数为N / k。然而从N个文字中保留下N / k个的情况也是相当多的。iPig估计,假设全部可能的k的全部情况数加起来为P的话。那么他研究古代文字的代价将会是G的P次方。 如今他想知道猪王国研究古代文字的代价是多少。
因为iPig认为这个数字可能是天文数字。所以你仅仅须要告诉他答案除以999911659的余数就能够了。
就是要求出P = C(N,i|N),然后解出G^P % 999911659就是最后的答案。
我们能够非常easy的看出问题是由两部分组成的,求解G^P和P。
我们能够easy的得出G^P用高速幂能够easy的解决,如今的问题是怎样高速的求出P呢?这是一个难题。我们在继续的分解,发现P的组成了没有。对!就是组合公式C(N,i|N)!而我们又能够知道组合公式假设数据较小的时候能够用杨辉三角的暴力公式得到。而假设是大组合数的话就要用到Lucas定理。(AekdyCoin空间给出了这方面的具体说明)而这题的组合数显然是大组合数。
而直接求就算是long
long 也要益处啊!
!怎么办?我们能够想到大组合数的通常处理方法。就是取模。
模?哪来的模?而此时我们又有费马小定理能够知道当P是素数的时候:
G^P % MOD = G ^ (P % (MOD - 1)) % MOD
所以,此时MOD - 1 = 999911658 是一个偶数,如今就不符合Lucas定理了。
所以,此时我们要对这个偶数进行质数分解。999911658 = 2 * 3 * 4679 * 35617 可是,如今问题又来了。你把模给分解了,那怎样求出结果呢?
我们在好好研究一下。你发现了什么没有?对!就是有例如以下的等式关系:
x = a1 % m1
x = a2 % m2
x = a3 % m3
.
.
.
.
对!
就是中国剩余定理!
如今。经过了一步一步的分解最终把问题攻克了。你该懂了吧!
一道神题啊!
!
/*
算法:模非素数的组合数
题目:就是要求出P = C(N,i|N),然后解出G^P % 999911659
1、对模质因子分解
2、中国剩余定理
1 <= G <= 10^9,1 <= N <= 10^9 */
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; typedef long long LL;
const int phi = 999911658;
const int MOD = 999911659;
const int MAXN = 200000; struct Prim{
int cnt,prim[MAXN],num[MAXN];
}pz,nz; int n,G;
LL a[MAXN];
LL fact[5][37777]; //分解质因子
void Div(Prim& p,int x){
p.cnt = 0; //初始化
int k = sqrt(x + 0.5);
for(int i = 2;i <= k;++i){
if(0 == x % i){
p.num[++p.cnt] = 0;
p.prim[p.cnt] = i;
while(0 == x % i){
++p.num[p.cnt];
x /= i;
}
}
} if(x > 1){
p.num[++p.cnt] = 1;
p.prim[p.cnt] = x;
}
} //预处理阶乘
void init(){
int i,j;
for(i = 1;i <= pz.cnt;++i){
fact[i][0] = 1;
for(j = 1;j <= pz.prim[i];++j)
fact[i][j] = fact[i][j-1] * j % pz.prim[i];
}
} //高速幂取模
LL powmod(LL a,LL b,const int& mod){
LL res = 1;
a %= mod; while(b > 0){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
} return res;
} LL Norma_C(int n,int m,int i){
int p = pz.prim[i];
return fact[i][n] * powmod(fact[i][m]*fact[i][n-m]%p,p-2,p) % p;
} //Lucas
LL Lucas(int n,int m,int i){
if(!m) return 1;
int p = pz.prim[i];
if(n%p < m%p) return 0;
LL tmp = Norma_C(n%p,m%p,i);
return tmp * Lucas(n / p,m / p,i) % p;
} //计算C(N,i)
void deal(int sum){
for(int i = 1;i <= pz.cnt;++i){
a[i] = (a[i] + Lucas(n,sum,i)) % pz.prim[i];
}
} //查找 i|N
void dfs(int dep,int sum){
if(dep > nz.cnt){
deal(sum);
return;
} dfs(dep+1,sum); //不要该数
for(int i = 1;i <= nz.num[dep];++i){ //要该数的情况
sum *= nz.prim[dep];
dfs(dep+1,sum);
}
} //扩展欧几里得
void extgcd(LL a,LL b,LL& d,LL& x,LL& y){
if(!b){ d = a; x = 1; y = 0; }
else { extgcd(b,a % b,d,y,x); y -= x * (a / b); }
} //中国剩余定理
LL china(){
LL M = phi,d,y,x = 0;
for(int i = 1;i <= pz.cnt;++i){
LL w = M / pz.prim[i];
extgcd(pz.prim[i],w,d,d,y);
x = (x + y * w * a[i]) % M;
}
x = (x + M) % M;
return x;
} int main()
{
while(~scanf("%d%d",&n,&G)){
memset(a,0,sizeof(a));
G %= MOD;
if(!G){
puts("0");
continue;
} //////////////////////////////// Div(pz,phi); //对模进行质因子分解
Div(nz,n); //对数进行质因子分解
init(); //预处理阶乘
dfs(1,1);
LL ans = china(); //中国剩余定理 ////////////////////////////////// printf("%lld\n",powmod((LL)G,ans,MOD)); //G^P
}
return 0;
}
1951: [Sdoi2010]古文字猪的更多相关文章
- BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...
- 1951: [Sdoi2010]古代猪文
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2171 Solved: 904[Submit][Status] ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- bzoj 1951 [Sdoi2010]古代猪文(数论知识)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1951 [思路] 一道优(e)秀(xin)的数论题. 首先我们要求的是(G^sigma{ ...
- 【刷题】BZOJ 1951 [Sdoi2010]古代猪文
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- bzoj 1951 [Sdoi2010]古代猪文 ——数学综合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 数学综合题. 费马小定理得指数可以%999911658,又发现这个数可以质因数分解.所 ...
- bzoj 1951: [Sdoi2010]古代猪文
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #defin ...
- BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)
题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...
- 【BZOJ】1951[Sdoi2010]古代猪文
[题意]给定G,N,求: $$ans=G^{\sum_{i|n}\binom{n}{i}}\ \mod\ \ p$$ 1<=N,G<=10^9,p=999911659. [算法]欧拉定理+ ...
随机推荐
- UVa 699 落叶
意甲冠军:我几乎不记得的题意!.! 它是一个长坑..我们从根节点开始,留下每一步,保存横坐标1,正确的一步加上横坐标1. 那么同样的横坐标统计data值总和. 思维:我来想,这可以递归成就.上就能够算 ...
- k8s with flanneld
三台机器 kmaster 192.168.1.201 kslave202 192.168.1.202 kslave203 192.168.1.203 安装好k8s 1. 在Node机器上安装flann ...
- Redis安装与基本配置(转)
一.下载与安装 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar -zxvf redis-3.0.0.tar.gz -c /u ...
- 写的好帮手项目官员 - Evernote 5.4(Evernote的) 中国绿色版
Evernote (中国名:Evernote的) 是一个自由和优秀的笔记软件或个人知识管理软件.它可以帮助你有效地管理所有类型的电子票据.信息等:xbeta 我写了很多信息化管理或 Evernote ...
- 采用Duplicate target database在线恢复秩序oracle datagard图书馆设备
线上oracle datagard备库由于断电以及误删除从库的归档日志文件,所以导致,备库主库数据不一致,备库须要紧急恢复.以下是大概恢复过程 1,从主库上面备份控制文件[oracle@localho ...
- iOS ... NS_REQUIRES_NIL_TERMINATION
看到官方的一个样例不错,这里留记. #import <Cocoa/Cocoa.h> @interface NSMutableArray (variadicMethodExample) - ...
- VS扩展开发框架
VsSharp:一个VS扩展开发框架(上) 上篇:设计 一.引子 自2008年起开发SSMS插件SqlSharp(er)的过程中,有一天发现多数代码都大同小异,就像这样. Commands2 comm ...
- 20天android学习
20多天的实习(事实上,一个人学习的东西)要结束, 其余的都只有读研. 此20许多天,我学到了很多东西, 至android的发展也有一定的了解.之后写这篇文章主要是完成研究可以学得很快再次回升 1.安 ...
- 多普勒失真信号采样Matlab模拟分析
多普勒失真信号采样Matlab模拟分析 方案 水声通信指的是使用声信号在水中数据传输. 相对而言.电磁信号在水中吸收严重衰减过快,光信号受水中悬浮颗粒的影响,也无法完毕远距离传输. 这两种信号的传播距 ...
- 大数据系列修炼-Scala课程10
今天主要是关于Scala中对List的相关操作,list在Scala中应该是至关重要,接下来会讲解关于List的一系列操作 List的map.flatMap.foreach.filter操作讲解 1. ...