快速幂

复制代码
 1 #include<stdio.h>
 2 int fun(int a,int b){
 3     int ans=1;
 4     while(b){
 5         if(b&1)ans*=a;
 6             a*=a;
 7             b>>=1;
 8     }
 9     return ans;
10 }
11 int main(){
12     int m,n;
13     while(~scanf("%d%d",&m,&n))printf("%d\n",fun(m,n));
14     return 0;
15 }
复制代码

邻接表:

复制代码
 1 #include<stdio.h>
 2 #include<string.h>
 3 char head[100100],cnt;
 4 struct s
 5 {
 6     int u,v,w;
 7     int next;
 8 }edge[100010];
 9 void add(int u,int v,int w)
10 {
11     edge[cnt].u=u;
12     edge[cnt].v=v;
13     edge[cnt].w=w;
14     edge[cnt].next=head[u];
15     head[u]=cnt++;
16 }
17 int main()
18 {
19     int n;
20     while(scanf("%d",&n)!=EOF)
21     {
22         int i;
23         cnt=0;
24         memset(head,'-',sizeof(head));
25         for(int i=0;i<100;i++)printf("%c ",head[i]); 
26         for(i=0;i<n;i++)
27         {
28             int u,v,w;
29             scanf("%d%d%d",&u,&v,&w);
30             add(u,v,w);
31         }
32         int u;
33         scanf("%d",&u);
34         for(i=head[u];i!=-1;i=edge[i].next)
35         {
36             int v=edge[i].v;
37             int w=edge[i].w;
38         }
39     }
40     return 0;
41 }
复制代码

 

快速幂+大数取模

 

快速幂,其实就是求(a^b)% p,(其中a,b,p都比较大在int范围内)这类问题。

首先要知道取余的公式:(a*b)%p=(a%p*b%p)%p。

那么幂不就是乘机的累积吗,由此给出代码:

int fast(int a,int b,int p)

{   long long a1=a,t=1;

   while(b>0)    

   { if(b&1)          /如果幂b是奇数多乘一次,因为后边会除2变偶数,(7/2=3)

    t=(t%p)*(a1%p)%p;

    a1=(a1%p)*(a1%p)%p;  

    b/=2;  

  }

  return (int)(t%p);

}

顺便把大数取模也给出吧,它的原理就是这个取余公式:(a+b)%p=(a%p+b%p)%p;

那么大数可以看做每一位的那位数字乘以自身的权然后每位相加。

如:12345678=(1*10000000)+(2*1000000)+…+8。

代码如下:

char s[200];

#define mod 10000010;

int main()

{   while(gets(s))

{   int k=strlen(s),sum=0;

  for(int i=0;i<k;i++)

  sum=(sum*10+s[i]-‘0‘)%mod;    /当然要是担心sum还可能溢出,那就对里边再拆开来取余

  cout<<sum<<endl;

} }

快速幂+大


1.模取运算的性质
(1)(a+b)%c =((a%c)+(b%c))%c
(2)(a*b)%c = ((a%c)*b)%c
2.快速幂乘计算a^b
(1)a,b都为正数,将b二进制化
(2)时间复杂度为logb,乘法次数不是最少的
__int64 power = 1;
while(b > 0){

if(b&1) 

power *= a;

a*= a;
b>>= 1;
}
return power
3.快速模幂(蒙哥马利算法)
__int64Power(int a,int b,int c)
{
//计算(a^b)%c

int digit[32]; 

int i, k;

__int64 power=1;

i=0;
while(b)

{

digit[i++]=b%2;

b >>=1;

}

for(k = i-1; k >=0; k--)

{

power=(power* power)%c;

if(digit[k]==1)

{

power=(power * a)% c;

}

}

return power;

}
4、
int exp_mod(int a,int b,int
n){

int r=1;

while(b){

if(b&1)r=(r*a)%n;

a=(a*a)%n;

b>>=1;

}
return r;

}
1.模取运算的性质

(1)(a+b)%c =
((a%c)+(b%c))%c


(2)(a*b)%c = ((a%c)*b)%c

2.快速幂乘计算a^b

(1)a,b都为正数,将b二进制化

(2)时间复杂度为logb,乘法次数不是最少的

__int64 power = 1;

while(b > 0){


if(b&1) power *= a;


a
*= a;


b
>>= 1;


}

return power

3.快速模幂(蒙哥马利算法)

__int64Power(int a,int b,int c)






{


//计算(a^b)%c



int digit[32]; 



int i, k;



__int64 power=1; 


i
=0;



while(b)



{



digit[i++]=
b%2;



b >>=1;



}



for(k = i-1; k >=0; k--)



{



power=(power* power)%
c;




if(digit[k]==1)



{




power=(power * a)% c;



}



}



return power;


}

4、

int exp_mod(int a,int b,int
n){



int r=1;



while(b){




if(b&1)r=(r*a)%n;



a=(a*a)%n;



b>>=1;




}



return r;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值