[SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文


$ solution: $
这道题感觉综合性极强,用到了许多数论中的知识:
- 质因子,约数,组合数
- 欧拉定理
- 卢卡斯定理
- 中国剩余定理
首先我们读题,发现题目需要我们枚举k(就是n的所有约数),并且对于每一个k都要用一个组合数算出其情况数(读题:不过具体是哪k分之一。这句话说明我们可以从n中取出任意k个字,所以情况数就是 $ C(_n^k) $ )(然后因为我们求的组合数范围有点大,所以需要用卢卡斯定理来求组合数(接下来我们会发现模数其实比较小))。但是这道题目把所有情况数(设有tot个情况),求为 $ G^{tot} $ 作答案输出。
众所周知,指数是不能直接取模的,所以我们要用到欧拉定理(注意欧拉定理建立在 $ gcd(G,999911659)=1 $ 的情况下,所以读入时要特判!)。
$ G{tot}=G{(tot\ mod \ \phi(P)+\phi(P))}\ mod(P) $
因为我们的模数为999911659(质数),所以我们其实就是要求这个东西:
$ G^{(tot\ mod \ 999911658+999911658)} $
但是我们发现虽然我们现在可以取模了,但是999911658并不是一个质数,而我们求tot的时候是需要用卢卡斯的,所以我们必须保证模数是一个质数且不能太大。所以我们又得用上中国剩余定理, $ 999911658=2\times 3\times 4679\times 35617 $
于是我们分别求出在 $ mod\ 2 \ ,mod\ 3,mod \ 4679,mod \ 35617 $ 意义下的所有tot,然后就需要中国剩余定理解出我们真正的 $ mod \ 999911658 $ 意义下的tot是多少,然后就可以直接搞快速幂求答案了!
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define mod 999911658
#define rg register int
using namespace std;
ll n,g,ans;
ll a[4];
ll jc[40005];
ll m[4]={2,3,4679,35617};
inline ll qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
ll res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
inline ll ksm(ll x,ll y,ll p){
ll res=1; x%=p;
while(y){
if(y&1)res=res*x%p;
x=x*x%p; y>>=1;
}return res;
}
inline ll c(ll x,ll y,ll p){ //组合数
if(x<y)return 0;
return jc[x]%p*ksm(jc[y],p-2,p)%p*ksm(jc[x-y],p-2,p)%p;//现求逆元
}
inline ll lc(ll x,ll y,ll p){ //卢卡斯
if(x<y)return 0; if(!x)return 1;
return c(x%p,y%p,p)*lc(x/p,y/p,p)%p;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); g=qr();
if(n==mod+1||g==mod+1){//特判
puts("0"); return 0;
}
for(rg k=0;k<4;++k){ jc[0]=jc[1]=1; //
for(rg i=2;i<=40000;++i)jc[i]=jc[i-1]*i%m[k]; //求出阶乘
for(rg i=1,j=sqrt(n);i<=j;++i){ //枚举约数
if(n%i!=0)continue;
a[k]=(a[k]+lc(n,i,m[k]))%m[k];
if(n==i*i)continue;
a[k]=(a[k]+lc(n,n/i,m[k]))%m[k];//n/i是较大的约数
}
}
for(rg i=0;i<4;++i)
ans=(ans+a[i]*(mod/m[i])%mod*ksm(mod/m[i],m[i]-2,m[i]))%mod;//中国剩余定理
printf("%lld\n",ksm(g,ans,mod+1));
return 0;
}
[SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)的更多相关文章
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [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] ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- 【BZOJ1951】[SDOI2010]古代猪文
[BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...
- 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT
[BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
随机推荐
- Bootstrap面板
前面的话 面板(Panels)是Bootstrap框架新增的一个组件,某些时候可能需要将某些 DOM 内容放到一个盒子里.对于这种情况,可以使用面板组件.本文将详细介绍Bootstrap面板 基础面板 ...
- c++ 为自定义类添加stl遍历器风格的遍历方式
为仿照stl的遍历风格,实现对自定义类型的遍历. 1. 需要遍历的基础结构: struct ConnectionPtr { int id_; int port_; string addr_; //st ...
- BZOJ2794[Poi2012]Cloakroom——离线+背包
题目描述 有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i]).再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得:1. 对于每个 ...
- MT【226】费马点两题
已知$z_1=2\sqrt{3}i,z_2=3,z_3=-3,|z_3-z_4|=2\sqrt{3},$则$|z_1-z_4|+|z_2-z_4|$的最小值为_____ 提示:费马点最小,取$Z_4( ...
- 【POJ 2251】Dungeon Master(bfs)
BUPT2017 wintertraining(16) #5 B POJ - 2251 题意 3维的地图,求从S到E的最短路径长度 题解 bfs 代码 #include <cstdio> ...
- 学习Spring Boot:(二十三)Spring Boot 中使用 Docker
前言 简单的学习下怎么在 Spring Boot 中使用 Docker 进行构建,发布一个镜像,现在我们通过远程的 docker api 构建镜像,运行容器,发布镜像等操作. 这里只介绍两种方式: 远 ...
- 用DBContext (EF) 实现通用增删改查的REST方法
我们用ADO.NET Entity Data Model来生成实体类后,一般都会对这些类进行基本的增删改查操作,如果每个类都要写这些基本的方法,实在太乏味了.下面就是通过step by step的方式 ...
- luogu1712 区间 (尺取法+线段树)
先把区间按照长度从小到大排序,然后用尺取法来做 大概就是先一点一点把区间算上 直到某个点被覆盖了m次,然后一点一点把最前面的区间扔掉,直到没有点被覆盖m次,这样反复做(相当于是它选择的区间左右端点在那 ...
- CF1131D Gourmet choice(并查集,拓扑排序)
这题CF给的难度是2000,但我感觉没这么高啊…… 题目链接:CF原网 题目大意:有两个正整数序列 $a,b$,长度分别为 $n,m$.给出所有 $a_i$ 和 $b_j(1\le i\le n,1\ ...
- 强大log
http://lovelease.iteye.com/blog/1886907 import java.io.BufferedReader; import java.io.File; import j ...