信息学奥赛一本通 提高篇 序列第k个数 及 快速幂

我是传送门

这个题首先是先判断是等差还是等比数列

等差的话非常简单:

前后两个数是等差的,举个栗子:

3 6 9 12

这几个数,(我感觉 1 2 3 4并说明不了什么)

每次都加3嘛,很容易看出,第一个数是3 * 1,第二个是3 * 2....以此类推

第k个数 = (第2个数 - 第1个数) * k ;

(z - y) * k % 200907

% 200907 的原因是题目要求

但是这样并不能过

hack一下

4 7 10 13

用原先的公式:
(7 - 4) * 4 % 200907 = 12;

明显不对啊

但是我们将序列每个都减一

就变成了: 3 6 9 12

熟悉滴感觉,但我们并不需要真的都减一,只需要加上差就可以了

x + (z - y) * (k - 1) % 200907

这个和我说的有些出入,但仔细想想就会发现是一样的

等比的话稍微难一点:

前后两个数是等比的,举个栗子:

3 6 18 27

第一个数是3^1

第二个数是3^2

第三个数是3^3

emmm,好像也很简单

这数据 不能乘10^9次吧

100000000000000% 超时

快速幂不错

快速幂怎么写呢

我在这里说一种非递归写法(其实本蒟蒻根本不明白递归的实现)

把幂次拆成二进制数,只需要乘log n 次,非常优秀的算法

比如 2 ^ 10 的二进制是 2的1010次幂

ans 就是  2 ^ 2 * 2 ^ 8 ;

当然数学上来讲  2 ^ 2 * 2 ^ 8 = 2 ^ (2 + 10)

long long ksm(long long a,long long b,long long n){//a是底数,b是幂数,n是mod数
    long long ans = 1;
    while(b){//等价于while(b != 0) ,dalao勿喷,讲给我这样的蒟蒻听
        if ( b & 1){//b & 1 等价于 b % 2 == 1
            ans *= a;//是的话乘起来
            ans %= 200907;//随时取膜性质
            /* code */
        }
        a *= a;//下一位
        a %= 200907;//膜
        b >>= 1;//右移一位  等价于 b /= 2;
    }
    return ans % 200907;
}

原文地址:https://www.cnblogs.com/lztzs/p/10861329.html

时间: 2024-10-06 00:45:35

信息学奥赛一本通 提高篇 序列第k个数 及 快速幂的相关文章

【信息学奥赛一本通 提高组】第二章 二分与三分

一.二分 二分法,在一个单调有序的集合或函数中查找一个解,每次分为左右两部分,判断解在那个部分并调整上下界,直到找到目标元素,每次二分都将舍弃一般的查找空间,因此效率很高. 二分常见模型 1.二分答案 最小值最大(或是最大值最小)问题,这类双最值问题常常选用二分法求解,也就是确定答案后,配合贪心,DP等其他算法检验这个答案是否合理,将最优化问题转化为判定性问题.例如,将长度为n的序列ai分为最多m个连续段,求所有分法中每段和的最大值的最小是多少? 2.二分查找 用具有单调性的布尔表达式求解分界点

信息学竞赛一本通提高版AC题解—例题1.1活动安排

书中代码有误.书中为sort(a+1,a+n+1,Cmp). // // Created by yuxi on 19-1-13. // /* * * <信息学竞赛一本通-提高版>全部AC解答及解释 * * 第一部分 基础算法 * 第一章 贪心算法 * 例题1 活动安排 * */ #include <iostream> #include <algorithm> #include <fstream> #include <string> using n

【信息学奥赛一本通】Part6.1 数学基础-快速幂

题目链接 A:序列的第k个数 输入描述:BSNY在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列.现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗.如果第k项的值太大,对200907取模. 第一行一个整数T,表示有T组测试数据:对于每组测试数据,输入前三项a,b,c,然后输入k. 输出描述: 对于每组数据输出第k项的值,对200907取模. 示例1 输入 2 1 2 3 5 1 2 4 5 输出 5 16 说明 第一组是等差序列,第二组是

信息学奥赛一本通 5.4 状态压缩动态规划

#loj 10170. 「一本通 5.4 例 1」骑士 看数据范围n<=10,所以不是搜索就是状压dp,又因为搜索会超时所以用dp dp[i][k][j]表示现已经放到第i行,前面共有k个,这一行状态为j so,dp[i][k][j]=dp[i-1][k-num[j]][t] #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cma

最大公约数(信息学奥赛一本通 1627)

[题目描述] 给出两个正整数 A,B,求它们的最大公约数. [输入] 输入共两行,第一行一个正整数 A,第二行一个正整数 B. [输出] 在第一行输出一个整数,表示 A,B 的最大公约数. [输入样例] 18 24 [输出样例] 6 [提示] 数据范围与提示: 对于 60% 的数据,1≤A,B≤1018: 对于 100% 的数据,1≤A,B≤103000 . 首先看到这道题的数据范围之后,我们肯定是得用高精度呐,然后为了方便一点,缩小数组大小,我们还可以引进“压位高精度”,一般来说,最好使用四位

【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数

给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS 1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 1000 4 5 char num[33]; 6 int len,q[maxn],Visited[11]; 7 long long ans = 1; 8 9 int main

信息学奥赛一本通 5.1 区间类动态规划

石子合并[loj 10147] /* dp[i][j]=max or min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]) i<=k<j */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int re

信息学奥赛一本通 5.2 树形动态规划

题解在代码中 二叉苹果树[loj 10153] /* 若要留q条边便是要留q+1个点 所以记忆化搜索 dp[pos][ans]=max(dp[pos][ans],dp[l[pos]][k]+dp[r[pos]][ans-k-1]+a[pos]) 0<=k<=ans-1 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<c

求后序遍历(信息学奥赛一本通 1339)

假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder: GDAFEMHZ InOrder: ADEFGHMZ PostOrder: AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"ADEFGHMZ"应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root. 第二步,继续观察前序遍历GDAFEMHZ,除了知道G是root,