您的位置:首页 > 其它

【快速幂模板】 nyoj102 次方求摸 420 p次方求和(快速幂+同余定理)

2016-11-06 10:32 489 查看
一般循环求解时间复杂度O(N)

快速幂时间复杂度O(log2(N))

求a^b

原理 :将b转化为二进制

           该二进制数第i位的权为


   如a^11

        11的二进制是1011
        11 = 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;
}


题目nyoj 102
题目信息

次方求模

时间限制: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


code:

#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


快速幂+同余定理

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: