P1951: [Sdoi2010]古代猪文
呜啊啊啊啊,选错了题,原以为很简单的优化+剪枝就能过结果牵扯到了一堆数论知识。我的错,贴上我的代码(已经尽量优化了)
const maxn=;
var n,g,i,j,ans:longint;
tem:int64;
function pow(g,x:longint):longint;
var
now,tem,i,t:int64;
begin
tem:=; now:=g;
if g= then exit();
while now<maxn do
begin
now:=now*now;
tem:=tem*;
end;
now:=now mod maxn;
if (now=) and (x div tem>=) then exit();
if x div tem>= then t:=pow(now,x div tem)
else t:=;
now:=g; x:=x-tem*(x div tem);
while x<> do
begin
if (x mod )= then begin
t:=(t*now) mod maxn;
end;
now:=(now*now) mod maxn;
x:=x div ;
end;
exit(t mod maxn);
end;
function c(x:longint):longint;
var i:longint;
tem:int64;
begin
tem:=g;
for i:= to x do
tem:=pow(tem,n-i+) mod maxn;
for i:= to x do tem:=trunc(exp(ln(tem)/i));
exit(tem);
end;
begin
readln(n,g);
tem:=;
for i:= to trunc(sqrt(n)) do
if n mod i= then
begin
if i*i<>n then tem:=tem*((c(i) mod maxn)*(c(n div i) mod maxn) mod maxn) mod maxn
else tem:=(tem*c(i)) mod maxn;
end;
writeln(tem mod maxn);
end.
然而正确的是。。
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
#define maxn 35620
typedef long long LL;
#define MOD 999911659
#define M 999911658
LL w[]={,,,};
LL a[];
LL fac[][maxn];
LL Pow(LL a,LL b,LL mod)//快速幂
{
LL ans=;
while(b)
{
if(b&) ans=(ans*a)%mod;
a=(a*a)%mod;
b >>= ;
}
return ans;
}
void init()//预处理阶乘
{
for(int i=;i<;i++)
{
fac[i][]=;
for(int j=;j<=w[i];j++)
{
fac[i][j]=(fac[i][j-]*j)%w[i];
}
}
}
/********************************
* 组合数取模用费马小定理
*********************************/
LL C(LL n,LL m,int x)//组合数取模
{
if(n < m) return ;
return (fac[x][n] * Pow((fac[x][n-m]*fac[x][m]),w[x]-,w[x]))%w[x];
}
/*******************************
* lucas 处理大组合数取模
********************************/
LL Lucas(LL n,LL m,int x)//lucas定理
{
if(m==) return ;
return (Lucas(n/w[x],m/w[x],x)*C(n%w[x],m%w[x],x))%w[x];
}
/****************************
* 扩展欧几里得求乘法逆元
*****************************/
LL exgcd(LL a,LL b,LL &x,LL &y)//乘法逆元
{
if(!b){x = ;y = ;return a;} LL ans = exgcd(b,a%b,x,y); LL t = x;x = y;y = t - a/b*y; return ans;
}
/***************************************************************************************
* 中国剩余定理:
* x = b1 % m1
* x = b2 % m2
* x = b3 % m3
* .
* gcd(m1,m2,m3,...) = 1;
* M = m1 * m2 * m3 *.....;
* M1 = m2 * m3 * ...., M2 = m1 * m3 * ...., M3 = m1 * m2 * m4 *....., ......;
* M1 * M(-1) = 1 % M ,M2 * M2(-1) = 1 % M;
* res = (M1(-1)*b1 + M2(-1)*b2+.....)%M;res即为所求值
* 注:如果取模的值相同:都是m1 那么 bn的值可以相加计算;
* 略屌。。。。。。。。。。。。。。
*
*****************************************************************************************/
LL CRT()//计算组合数和取模之后的值
{
LL i,d,x0,y0,ans=;
for(i = ;i < ;i++)//中国剩余定理
{
d=M/w[i];
exgcd(d,w[i],x0,y0);
ans=(ans+d*x0*a[i])%M;
}
if(ans <= ) ans += M;
return ans;
}
int main()
{
init();
LL g,n;
while(cin>>n>>g)
{
memset(a,,sizeof(a));
for(int i=;i*i<=n;i++)
{
if(n%i==)
{
LL tmp=n/i;
for(int j=;j<;j++)
{
if(tmp!=i) a[j]=(a[j]+Lucas(n,i,j))%w[j];
a[j]=(a[j]+Lucas(n,tmp,j))%w[j];
}
}
}
cout<<Pow(g%MOD,CRT(),MOD)<<endl;
}
return ;
}
我就不想多说了=-=
(转载请注明出处:http://www.cnblogs.com/Kalenda/)
P1951: [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] ...
- [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...
- 洛咕 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 ...
随机推荐
- Sql server 数据库 int 和guid 两者的比较
我们公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键.所以呢,这里总结一下,将两种数据类型做主键进行一个比较. 使用INT做主键的优点: 1.需要很小的数据存储空间,仅仅需要4 by ...
- 【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
Sql server 7.0/2000下 SqlCacheDependency使用轮询的方式进行缓存失效检查, 虽然ms说对服务器压力不大, 但还是有一些的, 而且对于不常改动的混存内容无休止的轮询感 ...
- C# 多线程传参
using System; using System.Threading; //多线程调试: 2013.10.08 namespace ThreadExample { class App { publ ...
- Magento后台界面全局样式修改之——font-weight
路径: \app\design\adminhtml\Magento\backend\web\app\setup\styles\less\lib\_variables.less
- 用户 'IIS APPPOOL\Classic .NET AppPool' 登录失败。
“用户 'IIS APPPOOL/Classic .NET AppPool' 登录失败”的解决方法 错误: “/”应用程序中的服务器错误. 用户 'IIS APPPOOL\Classic .NET ...
- 移动端rem自适应布局关键代码
function resi() { var html = document.querySelector("html"); var wW = document.body.client ...
- php5.3 连接 sqlserver2005
操作系统:XP php5.3以后,已经不对sqlserver支持连接扩展了,不过微软官方还是对php5.3以后进行了扩展解决方案. 1.确认要连接sqlserver的数据库版本为2005 2.确认ph ...
- LLVM language 参考手册(译)(3)
可见性模式(Visibility Styles) 所有全局变量和函数具有以下的可见性模式之一: “default” - Default style 在那些使用ELF object file格式的平台( ...
- MFC 线程创建方式
MFC 分UI线程和工作线程,一般现在的应用程序都是一个主UI线程和N个工作线程来完成工作.主UI线程获取到工作线程发送的信息来刷新界面. 不过因为工作需要,MFC有要维护的项目,因此就学习一下MFC ...
- bitmag