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 ...
随机推荐
- Asp.net默认配置下,Session莫名丢失的原因及解决
Asp.net默认配置下,Session莫名丢失的原因及解决 我们平时写的asp.net程序,里面要用到Session来保存一些跨页面的数据.但是Session会经常无故丢失,上网查查,也没找到原因. ...
- 安装package.js
- 安装minicom串口访问开发板
1. 安装minicom yum install minicom 2. 设置minicom minicom -s 选择“Serial port setup”,将“Serial Device”修改成 ...
- ububtu 14.04 问题集合
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4168168.html 1.Chromium 中的flash插件问题: sudo apt-ge ...
- 安装zabbix
安装zabbix 1. 准备好lamp架构(安装好mysql,php) 2.在数据库中授权: MariaDB [(none)]> create database zabbix charset u ...
- Mysql授权GRANT ALL PRIVILEGES
1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- Knockout.Js官网学习(click绑定)
前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...
- javascript组件化(转)
javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- JqueryUI
http://jqueryui.com/ http://www.runoob.com/jqueryui/jqueryui-tutorial.html