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

其实这题一半和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. tomcat在Debug模式下无法启动解决办法

    环境:eclipse,JDK1.6,tomcat6.0 问题:在server中正常启动tomcat是没问题的,javaweb项目也可正常访问,使用debug模式启动的话速度特别慢(好像一直处于那种启动 ...

  2. go 基础(二)

    strings和strconv使用 1.strings使用 strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头. str ...

  3. springboot整合activiMQ

    首先说明: 队列queue  的特点就是,许多人可以监听它,但是只有一个人能够收到消息. 主题topic    的特点就是,许多人监听它,都能收到消息. 需要安装activiMQ在自己的电脑上.启动方 ...

  4. Ruby数组的操作

    数组的创建arr = Array.new num #创建num个元素的数组,所有数组元素为nilarr = Array.new num, elem #创建num个元素的数组,所有数组元素为elemar ...

  5. dubbo序列化

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...

  6. HITS算法--从原理到实现

    本文介绍HITS算法的相关内容. 1.算法来源 2.算法原理 3.算法证明 4.算法实现 4.1 基于迭代法的简单实现 4.2 MapReduce实现 5.HITS算法的缺点 6.写在最后 参考资料 ...

  7. 六道JavaScript测验题

    1.找出数字数组中最大的元素(使用Match.max函数) var a=[123,23432,345,3,34]; console.log(Math.max.apply(null,a)); 2.转化一 ...

  8. C static struct

    参考链接:  http://blog.csdn.net/keyeagle/article/details/6708077/ NOTICE: 静态全局变量 与 普通的全局变量的区别   static 全 ...

  9. bootstrap-table插件数据加载方式

    data-url 直接使用data-url在table标签中定义 使用load方法加载数据 $(“#finishingTask”).bootstrapTable(‘load’,data); //dat ...

  10. 修改BlackLowKey皮肤样式,增加占屏比

    页面定制CSS代码 #home { margin: 0 auto; width: 100%; } #sideBar { min-height: 200px; padding: 0 5px 0 5px; ...