[NOI2012] 随机数生成器(洛谷P2044)

题目大意题目大意

题目链接

给定四个数 m,a,c,X0m,a,c,X_0 ,根据公式 :

Xn+1=(aXn+c)(modm)X_n+1 =(aX_n +c) \pmod{m}

求出 Xn(modg)的值X_n \pmod{g} 的值

解题思路解题思路

Q : 这题可以暴力解吗 ?( %卡常 dalaodalao

A : 哦,可以 显然是有规律的啦

  • 首先可以先按照递推式推几个
    • x[1]=(ax[0]+c)(modm)x[1]=(ax[0]+c)\pmod m
    • x[2]=a((ax[0]+c)+c)=a2x[0]+ac+c(modm)x[2] = a((ax[0] + c)+c) = a^2x[0] + ac + c \pmod m
    • x[3]=a(a2x[0]+ac+c)+c=a3x[0]+a2c+ac+c(modm)x[3] = a(a^2x[0] + ac + c)+c = a^3x[0] + a^2c + ac + c \pmod m

发现什么了吗?

xix_i 的第一项是 ai×x[0]a^i\times x[0] 后面是一个首项为 cc , 公比为 aa 的等比数列

  • SOSO
  1. 第一项可以用快速幂解决
  2. 如何对一个等比数列求和+取模?看下面
  3. 求公比为k的等比数列之和 Sum(n)Sum(n)
  • nn 为偶数 Sum(n)=Sum(n/2)[Pow(k,n/2)+1]Sum(n) = Sum(n/2) * [ Pow(k, n/2) +1]
  • nn 为奇数 Sum(n)=Sum(n/2)[Pow(k,n/2)+1]+Pow(k,n/1)tSum(n) = Sum(n/2) * [Pow(k, n/2) + 1] + Pow(k, n/1) * t
  • Pow(k,n/1)tPow(k, n/1) * t 为数列第 nn 项的值

发现这个也可以用递归解决

注:对爆long long乘法的取模,用龟速乘法就可以了

ACcodeAC code

#include <bits/stdc++.h>
using namespace std;
long long mod, a, c, x, n, g, MOD, m;
long long ans;
inline long long multy(long long x, long long y)
{
    long long ret = 0;
    for (; y; y >>= 1)
    {
        if (y & 1)
            ret = (ret + x) % mod;
        x = (x + x) % mod;
    }
    return ret;
}

long long Pow(long long a, long long k)
{
    long long x = a;
    long long ans = 1;
    for (; k; k >>= 1)
    {
        if (k & 1)
            ans = multy(ans, x);
        x = multy(x, x);
    }
    return ans;
}

long long Sum(long long n, long long t)
{
    if (n == 1)
        return t;
    long long ret = Sum(n / 2, t);
    ret = (multy(ret, Pow(m, n / 2) + 1)) % mod;
    //n为偶数 Sum(n) = Sum(n/2) * [Pow(k, n/2) + 1]
    if (n & 1)
        ret = (ret + multy(Pow(m, (n - 1)), t)) % mod;
    //n为奇数 Sum(n) = Sum(n/2) * [Pow(k, n/2) + 1] + Pow(k, n/1) * t ( 数列第n项的值 )
    return ret;
}

signed main()
{
    cin >> mod >> m >> c >> x >> n >> MOD;
    ans = multy(Pow(m, n), x);
    ans = (ans + Sum(n, c)) % mod;
    cout << ans % MOD;
    return 0;
}

posted @ 2021-05-11 21:59  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源