c语言算法-数之极(数的潜能)

题目:

题目要求是得到最大的M。
本题需要用到快速幂算法。

大佬思路:

对N进行拆解,拆解为2和3(只保留 3 和 2 这两个数字,相乘得到的M最大)

拆解过程中尽可能的多拆解出来3,其次是2。

那么该如何确定3和2的数量呢?

通过对N进行mod 3 运算,%3后的结果必是0或1或2。
如果取模结果为0,说明N可以被3整除,全部取3即可。
如果取模结果为1,说明N缺少2凑成3,那么直接商-1即减去1个3,减去的3与余数凑成4,即2+2,虽然是2+2,但是在计算M的时候是相乘,所以是*4.
如果取模结果为2,那么直接就是+2,也就是*2.

快速幂取模问题:

为了防止变量超界,我们根据取模运算的性质对取模过程进行修改,让乘法过程每一步都进行取模运算。具体可看 快速幂问题

本题代码:

#include<stdio.h>
typedef long long ll;
int func(ll a,ll b){
    int temp=1;
     while(b){
         if(b&1){ //奇数 
             temp=(temp*a)%5201314;
         }
         a=(a*a)%5201314;
         b/=2;
     }
     return temp;
} 
int main()
{
 ll a,res;
 scanf("%lld",&a);
 if(a==1){
     printf("1");
     return 0;
 }
 if(a%3==0){
     res = func(3,a/3);
 }else if(a%3==2){
     res = 2*func(3,a/3);
 }else {
     res = 4*func(3,a/3-1);
 }
 res%=5201314;
 printf("%lld",res);
 return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值