IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 18730 涂色问题 (快速幂的两种写法) -> 正文阅读

[数据结构与算法]18730 涂色问题 (快速幂的两种写法)

m^{n}

解题思路:组合计算的逆向思维法,发疯方案数F=总方案数S-不发疯方案数N。

不发疯方案数计算:第一间牛舍有m选择,第二间有m-1选择,同样第三间有m-1选择N=m*(m-1)^{n} , 总方案数S=m^{n},因此 F=S-N=m^{n}-m*(m-1)^{n}需要注意的是题目中的n很大,求一个数的n次幂,当n很大时用循环求取会超时,需采用快速幂算法。

快速幂是一种典型的分治算法。当我们要求m^{n}时,可以先求出x=m^{\frac{n}{2}},那么m^{n} = x*x同样的道理求取x时,可以先求m^{\frac{n}{4}},再做平方。特别注意,当n为奇数时,m^{n} = m*x*x

递归快速幂模板:

long long ksm(ll n,ll m)/**< 求n的m次幂,注意快速幂算法尽量用longlong类型 */
{
    if(m==1)
        return n%mod;
    long long temp;
    temp=ksm(n,m/2);/**< temp是n的m/2次幂 */
    temp=temp*temp%mod;
    if(m%2==1) /**< 如果m是奇数,那要多乘1个n */
        temp=n*temp%mod;
    return temp;
}

?另一种写法:可以注意到上面的递归算法是单递归算法,这类递归一般也能用循环方式来解决。

此处用到了二进制位的知识。举例说明:n的11次幂,11的二进制1011
n的11次幂可以看成是n^{8}*n^{2}*n^{1}?,因为二进制第三位是0,所以没有n^{4}。用循环依次获得n^{1},n^{2},n^{4},n^{8}.......,选择需要的进行乘法,比如11我们会选择n^{1},n^{2},n^{8}

long long ksm(ll n,ll m)
{
    ll ans=1;
    while(m) /**< 可以用十进制11,即二进制 1011来模拟和思考 */
    {
        if(m&1)/**< 二进制最后一位是1,奇数 */
            ans=ans*n%mod;
        n=n*n%mod; /**< n成为n^2,再循环会变成n^4,n^8...... */
        m=m>>1;/**< m右移一位 */
    }
    return ans;
}

?本题目完整代码:

#include <iostream>
typedef long long ll;
using namespace std;
const ll mod=1000000007 ;
long long ksm(ll n,ll m)/**< 求n的m次幂,注意快速幂算法尽量用longlong类型 */
{
    if(m==1)
        return n%mod;
    long long temp;
    temp=ksm(n,m/2);/**< temp是n的m/2次幂 */
    temp=temp*temp%mod;
    if(m%2==1) /**< 如果m是奇数,那要多乘1个n */
        temp=n*temp%mod;
    return temp;
}
long long ksm2(ll n,ll m)
{
    ll ans=1;
    while(m) /**< 可以用十进制11,即二进制 1011来模拟和思考 */
    {
        if(m&1)/**< 二进制最后一位是1,奇数 */
            ans=ans*n%mod;
        n=n*n%mod; /**< n成为n^2,再循环会变成n^4,n^8...... */
        m=m>>1;/**< m右移一位 */
    }
    return ans;
}
int main()
{
    ll m,n;
    cin>>n>>m;
    cout<<(ksm(m,n)-m*ksm(m-1,n-1)%mod+mod)%mod;
    return 0;
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:02:21  更:2022-04-23 11:06:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:33:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码