当前位置: 首页 > article >正文

梦回吹角连营(超1e18的快速幂模板,两大数相乘处理)

Description

给定f(n)=n^a+n^(a+1)+...+n^(b-1)+n^b
求f(n)%MOD

Input

输入一个正整数T(T<=10),表示有T组数据,每组数据包括三个整数a,b,n(0<=n,a,b<=1e9)

Output

输出 f(n)%10000000033 的结果

Sample Input

2
1 2 3
2 1 3

Sample Output

12
12

思路:

这道题难点在于两个数相乘有可能会超过1e18,所以,采用高精度处理两大数相乘

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define per(i,a,b) for(int i=a;i<=b;i++)
#define ber(i,a,b) for(int i=a;i>=b;i--)
const int N = 1e5 + 1000;
const long long mod = 10000000033;
long long n, a, b;
long long w[1000];
int ca[1000], cb[1000], cc[1000];
void into()
{
        w[0] = 1;
    for (int i = 1; i <= 1000; i++)
        w[i] = w[i - 1] * 10 % mod;
}
LL seek(LL a, LL b, LL mod)//计算两个大数相乘
{
    memset(ca, 0, sizeof ca);
    memset(cc, 0, sizeof cc);
    int i = 0;
    while (a)
    {
        ca[i] = a % 10;
        a /= 10;
        i++;
    }//将a存到数组内
    i--;
    int len = 0;
    int t = 0;
    for (int k = 0; k <= i; k++)
    {
        LL  x = b * ca[k];
         t = k;
        while (x)
        {
            cc[t] += (x % 10);
             x/= 10;
            while (cc[t] >= 10)
                cc[t + 1]++, cc[t] = cc[t] - 10;
            t++;
        }
    }//得到a与b相乘的结果,存到数组内
    for (int i = 100; i >= 0; i--)
        if (cc[i] != 0)
        {
            len = i;
             break;
        }
      LL ans = 0;
    for (int i = 0; i <=len; i++)
        ans = (ans + cc[i] * w[i] % mod) % mod;
    return ans % mod;
}
LL quick(LL a, LL b, LL mod)
{
    LL ans = 1;
    while (b)
    {
        if (b&1)
            ans = seek(ans, a, mod);
        b = b >> 1;
        a = seek(a, a, mod);
    }
    return ans;
}
int main()
{
    int T;
    into();
    cin >> T;
    while (T--)
    {
        cin >> a >> b >> n;
        if (a > b)
            swap(a, b);
        if (n == 0)
        {
            cout << 0 << endl;
            continue;
        }
        if (n == 1)
        {
            cout << b - a + 1 << endl;
            continue;
        }
        LL ans = quick(n - 1, mod - 2, mod);
        ans = seek(ans, quick(n, a, mod), mod);
        ans = seek(ans, quick(n, b-a+1, mod) - 1, mod);
        cout << (ans % mod + mod) % mod << endl;
    }
    return 0;
}


http://www.kler.cn/a/145708.html

相关文章:

  • STM32更新程序OTA
  • 【深度学习】Java DL4J 2024年度技术总结
  • Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
  • Yearning开源MySQL SQL审核平台
  • TCP断开通信前的四次挥手(为啥不是三次?)
  • 媒体新闻发稿价格怎么算?移动端发稿价格低的原因有哪些?
  • stm32实现0.96oled图片显示,菜单功能
  • Gin 学习笔记02-参数获取
  • 定制手机套餐---python序列
  • 【Spring】Spring事务失效问题
  • MySQL进阶_10.锁
  • 《已解决: ImportError: Keras requires TensorFlow 2.2 or higher 问题》
  • Docker部署Nacos
  • ubuntu22.04安装swagboot遇到的问题
  • 【2023.11.26】Mybatis自定义映射规则学习
  • 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等
  • 开源博客项目Blog .NET Core源码学习(7:FluentValidation使用浅析)
  • 使用 Raspberry Pi、Golang 和 HERE XYZ 制作实时地图
  • 2023亚太杯数学建模思路 - 案例:粒子群算法
  • 为什么PCB板大多数都是绿色的?
  • Android获取原始图片Bitmap的宽高大小尺寸,Kotlin
  • Spark的通用运行流程与Spark YARN Cluster 模式的运行流程
  • 粒子群算法Particle Swarm Optimization (PSO)的定义,应用优点和缺点的总结!!
  • 【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:
  • 线程的状态以及状态转移
  • Docker 部署 Nacos(单机),利用 MySQL 数据库存储配置信息