bzoj1951

CRT+LUCAS+费马小定理+拓展欧拉定理

幂指数太大了怎么办?欧拉定理,n太大了怎么办?上lucas,模数太大了怎么办?上crt。然后就好了,唯一注意的是要用拓展欧拉定理,n%phi(p)+phi(p)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod = 999911659ll, t[4] = {2, 3, 4679, 35617};
ll n, g;
ll a[5], fac[4][40010];
ll power(ll x, ll t, ll mod)
{
    ll ret = 1ll;
    for(; t; t >>= 1ll, x = x * x % mod) if(t & 1ll) ret = ret * x % mod;
    return ret;
}
ll inv(ll x, ll p)
{
    return power(x, p - 2, p);
}
ll C(ll n, ll m, int id)
{
    if(n < m) return 0;
    ll ret = fac[id][n] % t[id] * inv(fac[id][m], t[id]) % t[id] * inv(fac[id][n - m], t[id]) % t[id];
//  printf("C(%lld %lld) = %lld mod = %lld\n", n, m, ret, t[id]);
    return ret;
}
ll lucas(ll n, ll m, int id)
{
    if(n < m) return 0;
    if(n < t[id] && m < t[id]) return C(n, m, id);
    return lucas(n % t[id], m % t[id], id) % t[id] * lucas(n / t[id], m / t[id], id) % t[id];
}
ll CRT()
{
    ll M = mod - 1, ret = 0;
    for(int i = 0; i < 4; ++i) ret = (ret + a[i] * (M / t[i]) % M * inv(M / t[i], t[i]) % M) % M;
    return ret % M;
}
int main()
{
    scanf("%lld%lld", &n, &g);
    for(int i = 0; i < 4; ++ i)
    {
        fac[i][0] = 1ll;
        for(int j = 1; j <= t[i]; ++j) fac[i][j] = fac[i][j - 1] * (ll)j % t[i];
        for(ll j = 1ll; j * j <= n; ++j) if(n % j == 0)
        {
            ll mul = lucas(n, j, i);
//          printf("C(%lld %lld) = %lld\n", n, j, mul);
            a[i] = (a[i] + mul) % t[i];
            if(j * j != n)
            {
                mul = lucas(n, n / j, i);
//              printf("C(%lld %lld) = %lld\n", n, n / j, mul);
                a[i] = (a[i] + mul) % t[i];
            }
        }
    }
    printf("%lld\n", power(g % mod, CRT() % (mod - 1) + mod - 1, mod) % mod);
    return 0;
}

时间: 2024-10-12 17:42:24

bzoj1951的相关文章

BZOJ1951 [Sdoi2010]古代猪文

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ1951 正解:中国剩余定理+费马小定理+$Lucas$定理 解题报告: 这道题可以说是数论+组合大综合题- 题目求的是$\sum_{d|n} g^{C_n^d}$,模数$p$是质数(特判$g=p!$),根据费马小定理,我们可以把幂上的数

【bzoj1951】 Sdoi2010—古代猪文

http://www.lydsy.com/JudgeOnline/problem.php?id=1951 (题目链接) 题意 废话一堆..求解: Solution 真的是数论经典题,什么都用上了. 因为费马小定理,每p-1个g相乘会得到1,那么容易得到: 所以现在关键是求: 大组合数取模,Lucas定理,可是p-1并不是一个质数,怎么办呢.我们考虑用中国剩余定理,先将p-1质因数分解,再分别在模各个质因子的的条件下求出余数,最后用中国剩余定理合并得解. 代码 // bzoj1951 #inclu

bzoj1951【SDOI2010】古代猪文

1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1525  Solved: 627 [Submit][Status][Discuss] Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实

数学的东西(BZOJ1951)

#include <cstdio> #define LL long long LL finmo=999911659; LL fac[4][40001],inv[4][40001]; LL tmp[4],rev[4]; LL n,g,x,y; const LL mo[4]={2,3,4679,35617}; LL qpow(LL bas,LL pow,LL mo){ LL ret=1; for (;pow;bas*=bas,bas%=mo,pow=pow>>1){ if (pow&a

【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了.猪

【BZOJ1951】[中国剩余定理][SDOI2010]古代猪文

求g的p次方%mod, 根据费马小定理,g^sigma(C(n,d))(d|n)%mod=g^(sigma(C(n,d))(d|n)%(mod-1))%mod, 然而mod-1不是质数,只能用把它拆成4个质因数,然后对4个模方程分别求解,先用lucas定理和费马小定里求出对4个质数取模的sigma的值(num[i]),注意,枚举因数d的时候枚举到sqrt(n)就可以了,同时加上C(N,I)和C(n,n/i), 最后根据中国剩余定理合并:用拓展欧几里德求出每一个方程对 ax 解,然后把他们的值*n

bzoj千题计划323:bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)

https://www.lydsy.com/JudgeOnline/problem.php?id=1951 先欧拉降幂 然后模数质因数分解 分别计算组合数的结果,中国剩余定理合并 #include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typedef long long LL; int p[

bzoj1951 [Sdoi2010]古代猪文 ——数论综合

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 题意就是要求 G^( ∑(k|n) C(n,k) ) % p,用费马小定理处理指数,卢卡斯定理处理大组合数,取模用中国剩余定理合并: 好想难写的感觉(其实也不难写?): 关于中国剩余定理,可以看这篇博客:https://www.cnblogs.com/MashiroSky/p/5918158.html 第一次写中国剩余定理合并模数,还有一点不解的地方,写在注释里. 代码如下: #in

[bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT

Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃