看到全是矩阵的题解,我来一发递推+分治

其实这题一半和poj1845很像(或是1875?一个叫Sumdiv的题)

言归正传,我们看看怎么由f(0)推出f(n)

我们发现,题目中给出了f(n)=af(n-1)+c(取模略过)

那么顺着递推,可得:f(n-1)=af(n-2)+c

代入,得:

f(n)=a^2 f(n-2)+(a+1)c

继续递推,得:

f(n)=a^n f( 0 )+(a^ (n-1)+a^ (n-2)+...+1) c


左半部分,我们可以直接快速幂求a^n,再乘f(0)即可


右半部分,我们可以分治求出系数和。

怎么求?

我们发现,a^3+a^2+a+1=(a^2+1)(a+1)

那么对于任意奇次的推广,我们都可以如此因式分解,同时左半侧快速幂,右半侧递归求解即可。

而对于偶次,仅需将最高次项单独计算,剩下项继续递归即可


但要注意本题模数太大,乘法会直接爆long long,所以需要用到快速加(将乘法转化成加法快速幂的思想)

(PS:其实右半部分的分治可以用等比数列求和公式解决,但好像需要求逆元,会增大算法难度,所以直接分治解决就好)

贴代码

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
ll m,a,c,x0,n,g;
ll pow_add(ll x,ll y)
{
ll ans=0;
while(y)
{
if(y%2)
{
ans=(ans+x)%m;
}
x=(x+x)%m;
y/=2;
}
return ans%m;
}
ll pow(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y%2==1)
{
ans=pow_add(ans,x);
}
x=(ll)pow_add(x,x)%m;
y/=2;
}
return ans%m;
}
ll quick_sum(ll x,ll y)
{
if(y==1)
{
return (x+1)%m;
}
if(y==0)
{
return 1;
}
if(y%2)
{
return pow_add((pow(x,y/2+1)%m+1)%m,quick_sum(x,y/2)%m)%m;
}
return pow(x,y)%m+pow_add((pow(x,y/2)+1)%m,quick_sum(x,y/2-1)%m)%m;
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
x0%=m;
ll a0=pow(a,n)%m;
ll temp1=pow_add(a0,x0)%m;
ll temp2=pow_add(quick_sum(a,n-1)%m,c%m)%m;
ll ret=(temp1+temp2)%m%g;
printf("%lld\n",ret);
return 0;
}

NOI 2012 随机数生成器的更多相关文章

  1. 解题:NOI 2014 随机数生成器

    题面 为什么NOI2014有模拟题=.=??? 按题意把序列生成出来之后,对每一行维护一个能取到的最左侧和能取到的最右侧.从小到大$O(n^2)$枚举数字看看能否填入,能填入则暴力$O(n)$更新信息 ...

  2. BZOJ 3671 NOI 2014 随机数生成器 贪心

    题目大意:实在是太难说明了,自己看pdf吧.. 思路:优先依照它说明的方法处理数组,然后为了让数列中尽可能多的出现小的数字,所以1是必需要出现的,这样才干使整个数列的排序后字典序最小. 我们思考,假设 ...

  3. 【矩阵乘】【NOI 2012】【cogs963】随机数生成器

    963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷 ...

  4. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  5. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  6. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

  7. [BZOJ3671][UOJ#6][NOI2014]随机数生成器

    [BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...

  8. NOI2014 随机数生成器

    随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...

  9. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

随机推荐

  1. javascript 模拟日历

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. HDU - 3564 Another LIS(LIS+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3564 题意 给出1~n的插入顺序,要求每次插入之后的LIS 分析 首先用线段树还原出最终序列.因为插入的顺序是按 ...

  3. Shell编程(一)概览

    1. Shell功能 1. 自动化批量系统初始化程序(update.软件安装.时区设置.安全策略.......) 2. 自动化批量软件部署程序(LAMP.LNMP.Tomcat.LVS.Nginx) ...

  4. Spring集成mybatis时mybatis的映射XML配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  5. 007、Docker 架构详解(2018-12-24 周一)

    参考https://www.cnblogs.com/CloudMan6/p/6763789.html     Docker核心组件包括:       Docker 客户端   Docker Clien ...

  6. 微信现金红包 python

    微信现金红包发送接口,好像没法限制一个用户一个活动只能领取一次红包,在调用红包接口上,自己做了限制 REDPACK_RECORD 建表sql -- Create table create table ...

  7. Linux 4.10.8 根文件系统制作(三)---制作yaffs文件系统

    这里直接用的是韦东山提供的工具. yaffs文件系统是专门用于nandflash的文件系统 我们前面已经下载了yaffs 的源码,也做了文件系统目录的构建. 在yaffs2的源码目录中有一个utils ...

  8. Postfix 邮件服务 - PostfixAdmin

    PostfixAdmin 基于web的postfix邮件发送服务器的管理工具,可以直接管理postfix的虚拟域名和邮件用户,前提是这些数据是存储在mysql或者是PostgreSQL数据库中. Po ...

  9. 设计模式之UML类图六大关系辨析【2】

    六大关系:继承(extends).实现(Realization).依赖(use-a).关联(association).聚合(has-a).组合(强聚合)(Composition). 类与类之间的强弱关 ...

  10. luogu P1437 [HNOI2004]尻♂砖块

    传送门 想明白了其实不难 强行瞎扯 这题的限制比较烦,导致了一行行转移几乎不能做(吧) 那么一列列转移呢? 设\(f_{i,j,k}\)表示前\(i\)列,取\(j\)个,其中第\(i\)列取从上往下 ...