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的SEO:使用.ashx文件——排除重复内容
本系列目录 不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为"重复内容",如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高.所以我们应尽量避免各种重复内 ...
- C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- Zend Studio GitHub 使用教程
这是我在开发项目时遇到的一些问题总结,目前基本实现协同开发.还有个问题是怎么才能像sf那样添加管理帐号,使用多个帐号协同开发,求教,欢迎留言讨论. 一.安装eGit插件 1. 由于zend studi ...
- MyEclipse使用手册(详细版)
0. 快捷键================================================================================编辑:Ctrl+Shift+ ...
- CentOS学习笔记--账号管理与权限配置
Linux 的账号管理与权限配置 管理员的工作中,相当重要的一环就是『管理账号』啦! 使用者标识符: UID 与 GID 虽然我们登陆 Linux 主机的时候,输入的是我们的账号,但是其实 Linux ...
- C++ 三种工厂模式
工厂模式是将带有继承于基类的子类的创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类. 基于自己的理解和使用这里巩固一下工厂模式. 我们的项目目前使用最多的是简单工厂模式,不过其他两种 ...
- CSS: word-wrap和word-break
最近修改页面排版的一些问题,发现关于内容分词换行有两个主要的CSS: word-wrap 和 word-break 特别是word-wrap还有个取值break-word,更使得这两个属性容易混淆. ...
- winform之excel导入和导出
引用命名空间 using Microsoft.Office.Interop.Excel;DataGridView 导出到Excel public static void SaveAs(DataGr ...
- WinForm程序安装、发布流程
一 签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...
- jQuery实现跨域访问
示例: $.ajax({ url: url, crossDomain: true, async: false,dataType:"jsonp" }); 说明:$.ajax()有很多 ...