一般循环求解时间复杂度O(N)
快速幂时间复杂度O(log2(N))
求a^b
原理 :将b转化为二进制
该二进制数第i位的权为
如a^11
11的二进制是101111 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
a^11=
code:
int pow(int a,int b)
{
int r=1;
while(b)
{
if(b&1)
{
r*=a;
}
a*=a;
b>>=1;
}
return r;
}
次方求模
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
求a的b次方对c取余的值
-
输入
-
第一行输入一个整数n表示测试数据的组数(n<100)
每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000)
输出
- 输出a的b次方对c取余之后的结果 样例输入
-
3 2 3 5 3 100 10 11 12345 12345
样例输出
-
3 1 10481
-
第一行输入一个整数n表示测试数据的组数(n<100)
#include<stdio.h>
long long pow(int a,int b,int c)
{
long long m=a%c;
long long r=1;
while(b)
{
if(b&1)
r=(r*m)%c;
m=(m*m)%c;
b>>=1;
}
return r;
}
int main()
{
int T,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&a,&b,&c);
long long r=pow(a,b,c);
printf("%lld\n",r);
}
}
- 题目420
- 题目信息
p次方求和
时间限制:
1000 ms | 内存限制:
65535 KB
难度:3
-
描述
-
一个很简单的问题,求1^p+2^p+3^p+……+n^p的和。
-
输入
-
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,
输入保证0<n<=1000,0<=p<=1000。
输出
- 输出1^p+2^p+3^p+……+n^p对10003取余的结果,每个结果单独占一行。 样例输入
-
210 110 2
样例输出
-
55385
-
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,
快速幂+同余定理
code:
#include<stdio.h>
#define c 10003
int pow(int a,int b)
{
int r=1;
while(b)
{
if(b&1)
{
r=(r*a)%c;
}
a=(a*a)%c;
b>>=1;
}
return r;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,p,ans=0;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
{
ans+=pow(i,p);
ans%=c;
}
printf("%d\n",ans);
}
}