BZOJ 1951 Lucas定理+CRT
2024-08-31 02:34:42
思路:
枚举约数
套个裸的Lucas+CRT就完了...
//By SiriusRen
#include <cmath>
#include <cstdio>
using namespace std;
#define int long long
const int M=,N=;
void exgcd(int a,int b,int &x,int &y){
if(!b){x=,y=;return;}
exgcd(b,a%b,x,y);
int temp=x;x=y;y=temp-a/b*y;
}
int CRT(int *a,int *m,int num){
int ans=;
for(int i=;i<=num;i++){
int x,y;
exgcd(M/m[i],m[i],x,y);
ans=(ans+M/m[i]*x%M*a[i])%M;
}return ans;
}
int power(int x,int y){
int ans=;
while(y){
if(y&)ans=ans*x%(M+);
x=x*x%(M+),y>>=;
}return ans;
}
int m[]={,,,,},n,g,fac[N],inv[N],sqr,s[N],top,ans[],T;
int C(int x,int y){
if(x<y)return ;
if(x<m[T]&&y<m[T])return fac[x]*inv[y]%m[T]*inv[x-y]%m[T];
return C(x/m[T],y/m[T])*C(x%m[T],y%m[T])%m[T];
}
signed main(){
scanf("%lld%lld",&n,&g),sqr=sqrt(n);
for(int i=;i<sqr;i++)if(n%i==)s[++top]=i,s[++top]=n/i;
if(sqr*sqr==n)s[++top]=sqr;
if(n%sqr==&&sqr*sqr!=n)s[++top]=sqr,s[++top]=n/sqr;
fac[]=fac[]=inv[]=inv[]=;
for(T=;T<=;T++){
for(int i=;i<m[T];i++)fac[i]=fac[i-]*i%m[T];
for(int i=;i<m[T];i++)inv[i]=(m[T]-m[T]/i)*inv[m[T]%i]%m[T];
for(int i=;i<m[T];i++)inv[i]=inv[i]*inv[i-]%m[T];
for(int i=;i<=top;i++)ans[T]=(ans[T]+C(n,s[i]))%m[T];
}
printf("%lld\n",power(g,CRT(ans,m,)+M));
}
最新文章
- DashPathEffect
- 原生js实现放大镜效果
- web安全之ssrf
- [模板] 2-SAT
- SQL Server 建表语句
- MyEclipse启动Tomcat服务器时老是跳到Debug调试上
- (转载)Htmlparser Filter 简要归纳
- 使用TopShelf轻松开发Window服务
- php不区分大小写
- Palindrome Linked List leetcode
- 简单类型对象 String
- phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法
- C#删除字符串最后一个字符
- Redis快问快答
- 通过Erlang构建TCP服务应用案例(最原始方式)
- 【洛谷P2860】冗余路径
- API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署
- hdu 3861 The King’s Problem trajan缩点+二分图匹配
- (25)uniGUI for C++ builder之UniHTMLMemo初使用及uniGUI如何调用javaScript
- 《Javascript权威指南-第6版》
热门文章
- dotnetnuke 中使用ado.net entityframework 如果在程序中动态调用系统的连接字符串信息
- OpenCV:OpenCV目标检测Hog+SWindow源代码分析
- SLAM:飞行机器人的参数解析-分类
- 分布式机器学习框架:MxNet 前言
- 【转载】浏览器缓存详解:expires cache-control last-modified
- 微信小程序中的iPhone X适配问题
- .NET Framework 3.5 安装
- 单链表每k个节点为一组进行反转(最后不满k个时不反转)
- es 存入失败错误
- ADB 常用命令学习