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]古文字猪的更多相关文章

  1. 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 ...

  2. 1951: [Sdoi2010]古代猪文

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2171  Solved: 904[Submit][Status] ...

  3. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

  4. bzoj 1951 [Sdoi2010]古代猪文(数论知识)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1951 [思路] 一道优(e)秀(xin)的数论题. 首先我们要求的是(G^sigma{ ...

  5. 【刷题】BZOJ 1951 [Sdoi2010]古代猪文

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  6. bzoj 1951 [Sdoi2010]古代猪文 ——数学综合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 数学综合题. 费马小定理得指数可以%999911658,又发现这个数可以质因数分解.所 ...

  7. bzoj 1951: [Sdoi2010]古代猪文

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #defin ...

  8. BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)

    题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...

  9. 【BZOJ】1951[Sdoi2010]古代猪文

    [题意]给定G,N,求: $$ans=G^{\sum_{i|n}\binom{n}{i}}\ \mod\ \ p$$ 1<=N,G<=10^9,p=999911659. [算法]欧拉定理+ ...

随机推荐

  1. hibernate set的3属性

    inverse 属性 在hibernate通过对 inverse 和表之间的关系. inverse = false 的为主动方,inverse = true 的为被动方, 由主动方负责维护关联关系 在 ...

  2. JSP简单的练习-使用JDOM阅读xml文件

    <%@ page contentType="text/html; charset=gb2312" language="java" %> <%@ ...

  3. Java学习之路:ArrayList用法

    1.什么是ArrayList     ArrayList是一个动态数组传奇,使用MSDN声明.那是,Array复杂的版本号,它具有以下优点,例如: 动态的添加和降低元素 实现了ICollection和 ...

  4. css 鼠标提示样式预览表[转]

    语法: cursor : auto | all-scroll | col-resize| crosshair | default | hand | move | help | no-drop | no ...

  5. Android Widget 小部件(四---完结) 使用ListView、GridView、StackView、ViewFlipper展示Widget

    官方有话这样说: A RemoteViews object (and, consequently, an App Widget) can support the following layout cl ...

  6. polay定理总结

    参考资料:url=YveSCnlx_dlXo4oGjE8w3_2QRObRXvXMbix81ppCxBGqBswxffwDN9frzY5xxaKf7GgEMY8K93JTPEhkBzY66XOaN0G ...

  7. NYNU_省赛选拔题(6)

    题目描述 有一天,小米找到了一个藏宝的迷宫地图,迷宫在一个沙漠里有,迷宫里面有许多宝藏.迷宫里可能有N个藏宝地点,用1到K标记.藏宝地点之间最多有一条通路相连.标记1为迷宫的进出口. 他已经知道其中K ...

  8. 对于VS相关的插件

    原文:对于VS相关的插件 本人使用这款IDE时间不长,但是很佩服其强大的功能. 编写代码时候的插件辅助,确实让人很舒服. 网上找了好多,有几个是很有用的,但是忘记了他们的网址,再次,总结下,也是给自己 ...

  9. Lake Counting (DFS)

    N*M的园子,雨后积起了水.八连通的积水背认为是连接在一起的.请求出园子里总共有多少水洼? dfs(Depth-First  Search)  八个方向的简单搜索.... 深度优先搜索从最开始的状态出 ...

  10. SlidingMenu 左侧滑动菜单

    1.MainActivity package loveworld.slidingmenu; import java.util.ArrayList; import android.app.Activit ...