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

Posted cutele

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信息学奥赛一本通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

说明

第一组是等差序列,第二组是等比数列。

备注:

对于全部数据,1≤T≤100,1≤a≤b≤c≤109,1≤k≤1091 leq T leq 100,1 leq a leq b leq c leq 10^9,1 leq k leq 10^91T100,1abc109,1k109。

解题思路:根据等差和等比数列的性质求解即可
技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b,ll p){
    ll res=1;
    while(b){
        if(b&1) res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        ll p=200907;
        ll a,b,c,k;
        cin>>a>>b>>c>>k;
        if(a+c==2*b) cout<<(a+(b-a)*(k-1))%p<<endl;
        else cout<<a*ksm(b/a,k-1,p)%p<<endl;
    }

    return 0;
}
View Code

B:A的B次方

 

题目描述

给出三个整数a,b,m,求ab?mod?ma^b mod mabmodm的值。

输入描述:

一行三个整数a,b,m。

输出描述:

一个整数,表示ab?mod?ma^b mod mabmodm的值。
示例1

输入

2 100 1007

输出

169

备注:

对于全部数据,1≤a,b,m≤1091 leq a,b,m leq10^91a,b,m109。

解题思路:扔个板子 结束
技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b,ll p){
    ll res=1;
    while(b){
        if(b&1) res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
int main(){
    ll a,b,m;
    cin>>a>>b>>m;
    cout<<ksm(a,b,m)<<endl;
    return 0;
}
View Code

C:转圈游戏



题目描述

n个小伙伴(编号从0到n-1)围坐一圈玩游戏。按照顺时针方向给n个位置编号,从0到n-1。最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置,……,依此类推。
游戏规则如下:每一轮第0号位置上的小伙伴顺时针走到第m号位置,第1号位置小伙伴走到第m+1号位置,……,依此类推,第n−m号位置上的小伙伴走到第0号位置,第n-m+1号位置上的小伙伴走到第1号位置,……,第n-1号位置上的小伙伴顺时针走到第m-1号位置。
现在,一共进行了10k10^k10k轮,请问x号小伙伴最后走到了第几号位置。

输入描述:

输入共1行,包含4个整数n、m、k、x,每两个整数之间用一个空格隔开。

输出描述:

输出共1行,包含1个整数,表示10k10^k10k轮后x号小伙伴所在的位置编号。
示例1

输入

10 3 4 5

输出

5

备注:

对于30%的数据,0 < k <7;
对于80%的数据,0<k<1070 < k <10^70<k<107;
对于100%的数据,1<n<1061< n < 10^61<n<106,0<m>,0<k<1090< k < 10^90<k<109。</m>

解题思路:规律:(x+m*ksm(10,k,n)%n)%n

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b,ll p){
    ll res=1;
    while(b){
        if(b&1) res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
int main(){
    ll n,m,k,x;
    cin>>n>>m>>k>>x;
    cout<<(x+m*ksm(10,k,n)%n)%n<<endl;
    return 0;
}
View Code

D:越狱

 

题目描述

监狱有连续编号为1到n的n个房间,每个房间关押一个犯人。有m种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。

输入描述:

输入两个整数m和n。

输出描述:

可能越狱的状态数,对100003取余。
示例1

输入

2 3

输出

6

说明

所有可能的6种状态为:{0,0,0 }, {0,0,1 }, {0,1,1 }, {1,0,0 }, {1,1,0 }, {1,1,1 }。

备注:

对于全部数据,1≤m≤108,1≤n≤10121 leq m leq 10^8,1 leq n leq 10^{12}1m108,1n1012。
解题思路:正难则反;总的可能-发生越狱的可能数
技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b,ll p){
    ll res=1;
    while(b){
        if(b&1) res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
int main(){
    ll m,n;
    ll p=100003;
    cin>>m>>n;
    cout<<((ksm(m,n,p)-m*ksm(m-1,n-1,p))%p+p)%p<<endl;
    return 0;
}
View Code

 

 

以上是关于信息学奥赛一本通Part6.1 数学基础-快速幂的主要内容,如果未能解决你的问题,请参考以下文章

信息学奥赛一本通为啥不通过

长春市哪里有卖这本信息学奥赛一本通c++的书店?

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

信息奥赛一本通 1060:均值

《信息学奥赛一本通》题库 1034 计算三角形面积——基础

信息学奥赛一本通 1.2 二分与三分