【复赛模拟试题】求和 分治+二分快速幂
来源:互联网 发布:数据库客户端如何使用 编辑:程序博客网 时间:2024/06/05 15:41
【问题描述】
计算 1^b+2^b+…+a^b 的和除以 10000 的余数;
【输入格式】
第一行一个整数N,表示有N组测试数据;
接下来N行,每行包含两个正整数a和b。
【输出格式】
N行,对应输入的答案
【输入样例】
1
2 3
【输出样例】
9
【数据范围】
30%的数据满足:1<=N<=10,a,b<=1000
100%的数据满足:1<=N<=100,a,b<=1000000000
——————————————————————————————————————————————————
问题的解决主要是利用mod=10000。通过这个条件我们发现10001^x%10000=1^x%10000,以此类推。
所以说问题的时间复杂度为O(10000*log2b)。
顺便对比了一下迭代快速幂和递归快速幂的区别,妥妥的递归时间长上一倍(斜眼)。
AC代码:
#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;const int maxn=10005;const int mo=10000;int N,a,b;int C[maxn];int mpow(int x,int y){ int re=1,tt=x; for(int i=0;(1<<i)<=y;i++) { if((1<<i)&y) re=re*tt%mo; tt=tt*tt%mo; } return re;}int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%d",&N); C[0]=1; while(N--) { scanf("%d%d",&a,&b); int upper=min(mo,a),ans=0; for(int i=1;i<=upper;i++) C[i]=mpow(i,b),ans=(ans+C[i])%mo; if(a>mo) { ans=ans*(a/mo)%mo; a%=mo; for(int i=1;i<=a;i++) ans=(ans+C[i])%mo; } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 【复赛模拟试题】求和 分治+二分快速幂
- 【复赛模拟试题】求和
- 【复赛模拟试题】收费站(二分答案+Dijkstra)
- 【复赛模拟试题】收费站
- 【复赛模拟试题】河床
- 【复赛模拟试题】计数排序
- 【复赛模拟试题】 物品选取
- 【复赛模拟试题】学生公寓 贪心
- poj 3233 矩阵快速幂 + 二分求和
- 快速矩阵幂+二分等比数列求和
- [noip模拟赛]求和(快速幂)
- 【复赛模拟试题】书的排序
- 【复赛模拟试题】盛夏的果实
- 【复赛模拟试题】寿司 中位数思想
- 【复赛模拟试题】新斯诺克 逆序对
- 【复赛模拟试题】奶牛卧室 筛法
- 【例题&结论】【分治(等比数列二分求和)】NKOJ 3716 数列求和
- Matrix Power Series(poj3233快速幂+矩阵二分幂+分治)
- SpringBoot配置log4j2的JdbcAppender日志写入数据库,可定义哪些日志写入
- Docker for Windows 里的Shared Drives 设置不生效
- kuangbin J
- Java内部类详解
- 上拉电阻与下拉电阻
- 【复赛模拟试题】求和 分治+二分快速幂
- Linux中exec命令相关
- 配置好apache SSL之后 浏览器https访问未响应的解决方法
- Andorid事件分发源码解析
- 图论的题目
- Linux网络编程
- 51Nod 1008 N的阶乘 mod P
- Servlet(3)ServletConfig接口的介绍(获取web.xml中某个Servlet中的初始配置参数)
- Dijkstra's Algorithm(迪杰斯特拉算法)