[NOI2012] 随机数生成器(洛谷P2044)
给定四个数 ,根据公式 :
求出
Q : 这题可以暴力解吗 ?( %卡常 )
A : 哦,可以 显然是有规律的啦
- 首先可以先按照递推式推几个
发现什么了吗?
的第一项是 后面是一个首项为 , 公比为 的等比数列
- 第一项可以用快速幂解决
- 如何对一个等比数列求和+取模?看下面
- 求公比为k的等比数列之和
- 为偶数
- 为奇数
- 为数列第 项的值
发现这个也可以用递归解决
注:对爆long long乘法的取模,用龟速乘法就可以了
#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;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122184
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话