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)(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)(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;
}