首先经过读题,我们发现找到合格的金坷垃,怎么样的金坷垃才是合格的呢?(我们不难发现1肯定是合格的【题目已经给出了】)

然后我们开始手推一下之后合格的金坷垃:

2-1=1(合格)

3-1-1=1(不合格(1重复减了))

4-2-1=1(合格)

......


对于任意一个数,他减去他的任意一个约数(除它本身)最小值都为他本身的1/2,我们可以考虑倒着推回去这样就行了,发现合格的金坷垃必须是2的倍数,我们可以用反证法来证明,如果一个合格的金坷垃不是二的倍数,那么最后经过前面的相减肯定会变成一个质数。

一个质数的约数(除它本身)只有1,但我们用一个数只能用一次,那么这个金坷垃就不是一个合格的金坷垃

如90:

90-45=45;

45-15=30;

30-10=20;

20-5=15;

15-3=12;

12-6=6;

6-3=3;

最后剩下了3(质数)【这个各位可以自己推一下】


1;

1+1=2;

1+1+2=4;

1+1+2+4=8;

1+1+2+4+8=16;

......

不难发现第i个合格的金坷垃就是2的i-1次方,这样我们就可以用快速幂来解决了


直接用快速幂模板就能过了!

#include<bits/stdc++.h>//万能头
using namespace std;
const int mod=123456789;//要mod的值
long long n;
long long qmi(long long x,long long k){//快速幂模板
long long res=1;
while(k>0){
if(k&1){
res=res*x%mod;
}
x=x*x%mod;
k>>=1;
}
return res;
}
int main(){
cin>>n;
cout<<(qmi(2,n-1)%mod+mod)%mod<<endl;//输出2的n-1次方,(qmi(2,n-1)%mod+mod)%mod是防负数的,但这个没有负数就可以不用写
return 0;//结束程序
}

根据这个题目我们可以引出快速幂了:

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。这就可以让我们不用担心t掉了。

快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。(一般在题目当中都会mod一个数字,我们也不用考虑写高精度)
让我们先来看一个简单的例子:
我们用ans来记录答案
因为这个是乘法,所以说ans赋值为1;
3^10=3*3*3*3*3*3*3*3*3*3*ans
3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)*ans
3^10=(3*3)^5*ans;
3^10=9^5
-----------------  一次操作(n为偶数的情况)(n为偶数的情况,ans的值不会改变)
3^10=(9^4)* 9
ans=ans*9;
3^10=  (9^4)*ans
9^5= (81^2)*ans
-----------------  又一次操作(n为奇数的情况)(n为奇数的情况,ans的值等于它本身×底数)
 
所以在实现代码之前,我们先在这里总结一下快速幂
  • 优势:
  • 时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高
  • 用法:
  • 指数为奇数,ans=ans*底数,底数平方,指数右移一位(除以2向下取整)
  • 指数为偶数,ans不变,底数平方,指数右移一位(除以2)
 代码实现
int qmi(int m, int k, int p)
{
int ans = 1 % p, t = m;
while (k)
{
if (k&1) ans = ans * t % p;//如果指数是奇数的话,ans=ans*底数t
t = t * t % p;//底数平方(无论指数是奇数还是偶数都要平方)
k >>= 1;//指数右移一位(除以2或者向下取整)
  }
  return res;
}

P5035金坷垃题解(快速幂的讲解)的更多相关文章

  1. FJUT寒假作业第二周G题解快速幂

    题目来源:http://210.34.193.66:8080/vj/Contest.jsp?cid=161#P6     题意:求n个数字的乘积对c取摸.主要就是有快速幂扩展到广义幂的过程. 首先题目 ...

  2. 89. a^b【快速幂模板】

    a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...

  3. csu 1556(快速幂)

    1556: Jerry's trouble Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 787  Solved: 317[Submit][Statu ...

  4. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  5. codevs3500 快速幂入门题解

    codevs3500 快速幂入门题解 //我也是抄的题解 题目描述 Description 输入3个数a,b,c,求a^b mod c=? 输入描述 Input Description 三个数a,b, ...

  6. 洛谷 P1226 【模板】快速幂||取余运算 题解

    Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...

  7. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  8. 小白详细讲解快速幂--杭电oj2035-A^B

    Problem Description 求A^B的最后三位数表示的整数.说明:A^B的含义是“A的B次方”  Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<= ...

  9. 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)

    Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...

随机推荐

  1. VUE+ElementUI创建项目

    1.官网下载node,安装node.js环境 安装完成后进入cmd,输入node -v和npm -v查看node和npm是否安装成功及对应的版本 2.全局安装vue-cli:cnpm install ...

  2. 使用Arcgis时,在sde空间库常用的相关函数

    一.Oracle库中配置好sde空间库常见的场景 1.在sde库中创建表:community 创建表:community 字段:id(INTEGER), shape(ST_GEOMETRY) 2.往s ...

  3. element-ul二次封装table表格

    在项目中el的表格使用的地方太多了,若不进行封装,使用的时候页面会显得非常的冗余且难以维护,有时表格样式还不能做到一致:今天分享一个在工作中封装的表格 由于大多代码都在页面有介绍,就不在外面解释了 一 ...

  4. 【免费】windows下如何生成tar.gz,一键生成tar.gz

    废话 一.实验背景 tar.gz 是Linux和Unix下面比较常用的格式,一条命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见. Linxu服务器上,tar.gz 包 ...

  5. if-else 可以这么写

    最近部门在对以往的代码做一些优化,我在代码中看到一连串的 if(){}elseif(){} 的逻辑判断.这明显是有优化空间的. 由于内部代码不适合分享,这里我就用 <输出今天为星期几> 来 ...

  6. 上海做假证t

    上海做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...

  7. HDU-多校2-Everything Is Generated In Equal Probability(公式+逆元)

    Problem Description One day, Y_UME got an integer N and an interesting program which is shown below: ...

  8. 剑指 Offer 49. 丑数

    题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, ...

  9. Oracle的timestamp字段更新实验 结论:只有逐条更新才能保证timestamp字段有差别,批量更新只会得到一致的时间,此操作无关时间精度.

    有这么一张表: create table hy_testtime( id number(6,0) not null primary key, name nvarchar2(20) not null, ...

  10. MyBatis动态SQL(使用)整理

    MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的.MyBatis 动态 SQL 的出现, 解决了这个麻烦. MyBa ...