hdu 2837 Calculation

本文提供了一道关于数论的题目解答,利用快速幂运算和欧拉函数简化大数运算,通过具体代码实现展示了如何解决A^B%C的问题,并给出完整的C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2837

额,这两天做上了数论,搞了一个上午终于AC了,不过还是看了别人的代码。。

就是利用一个公式A^B %C  = A^( B%phi[C]  + phi[C]) %C    (B>=phi[C])

大致思路还算清晰,就是要注意中间的细节。

回头再看看吧~~

View Code
 1 # include<stdio.h>
 2 # include<string.h>
 3 # include<stdlib.h>
 4 __int64 eular(__int64 num)
 5 {
 6     __int64 ret=1;
 7     for(int i=2;i*i<=num;i++)
 8     {
 9         if(num%i==0)
10         {
11             num/=i;ret*=i-1;
12             while(num%i==0) {num/=i;ret*=i;}
13         }
14     }
15     return num>1? ret*(num-1):ret;
16 }
17 __int64 mod(__int64 A,__int64 B,__int64 C) //A^B%C
18 {
19     __int64 ans,res=1;
20     int i;
21     ans=1;
22     for(i=1;i<=B && res<=C;i++) res=res*A; 
23     while(B)
24     {
25         if(B%2) ans=ans*A%C;
26         A=A*A%C;
27         B/=2;
28     }
29     if(res>=C) return ans+C;
30     return ans;
31 }
32 
33 ///// A^B %C = A^( B % Phi[C] + Phi[C]) % C       (B >= Phi[C])
34 __int64 dfs(__int64 n,__int64 m) //f[n]%m
35 {
36     __int64 ans;
37     ans=eular(m);
38     if(n==0) return 1%m;
39     return mod(n%10,dfs(n/10,eular(m)),m);
40 }
41 
42 int main()
43 {
44     int ncase;
45     __int64 num,n,m;
46     scanf("%d",&ncase);
47     while(ncase--)
48     {
49         scanf("%I64d%I64d",&n,&m);
50         num=dfs(n,m);
51         printf("%I64d\n",num%m);
52     }
53     return 0;
54 }

 

 

转载于:https://www.cnblogs.com/183zyz/archive/2012/05/11/2495856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值