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 ...
随机推荐
- 使用eclipse与jLink V8调试exynos 4412 u-boot
/** ****************************************************************************** * @author Maox ...
- HTML新特性之一----canvas
<canvas id="me"></canvas>//申请一个canvas标签 <script> var c ...
- c#操作xml增删改查
1.首先新建一个xml文件(Root是我写上的) 2. 3.直接上代码,更直观 (1)初始化xml /// <summary> /// 初始化xml /// </summary> ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter
在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...
- C#中string[ ] args是什么意思,又有什么用呢
转载:http://blog.sina.com.cn/s/blog_8b7263d1010172jv.html C#控制台程序中static void Main(string[ ] args) str ...
- 日志处理--Logo4Net与文件的并发处理
本文参考自:http://www.cnblogs.com/jiekzou/ 多线程操作同一个文件时会出现并发问题.解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得 ...
- JavaScript计算日期间隔以及结果错误(少一天)的解决方法
下面的代码是之前从网上某个地方COPY下来的,之前一直用着,前段时间DateDiff()方法突然出问题了,输入两个日期2015-10-01 和 2015-10-02之后,计算出来的日期是0!如果只有几 ...
- Java基本开发环境搭建(适合第一次使用)
Java基本开发环境搭建(适合第一次使用) 编写人:cc 阿爸 2013-10-17 一.开发工具获取 1.开发工具包JDK l 下载地址: 到ORACLE公司官方网站(http://www.ora ...
- JS组件系列——KnockoutJS用法
前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...
- Ueditor防止代码自动清除
Ueditor功能真的很牛逼,可也有让人悲催的地方,尤其是自动清除代码,会将你默认的div标签改成p,挺让人闹心的,不过Ueditor的开发人员还是满热心的,搜遍网上无答案的时候,问了下他们,解决了 ...