等比數列求和和求模的高階運用(程式設計題)
Input
輸入一行,包括兩個數,N和M。其中n,m≤50000
Output
Sample Input
3 3
Sample Output
56
HINT
N=3,M=3,這個值為(1^1+1^2+1^3+2^1+2^2+2^3+3^1+3^2+3^3)%(1e9+7)=56.
思想:
核心1:等比數列的求和轉換,分奇數、偶數。可參考:https://blog.csdn.net/CHNWJD/article/details/59697144
核心2:(a+b+c)%d = (a%d+b%d+c%d)%d
程式碼:
#include <stdio.h>
#include <stdlib.h>
#define LEN 1000000007
long long MkNi(long long k,long long i)
{
long long ans=1;
while(i>0){
if (i%2==1){
ans=(ans*k)%LEN;
i--;
}
i=i/2;
k=(k*k)%LEN;
}
return ans;
}
long long dbsl(long long a1,long long n)
{
if(n<=1) return a1;
long long sum;
long long sn=dbsl(a1,n/2);
if(n%2==0)
sum=(sn + MkNi(a1,n/2) * sn)%LEN;
else
sum=( sn+ MkNi(a1,n/2) * sn + MkNi(a1,n))%LEN;
return sum;
}
int main()
{
long long n=0,m=0,i;
long long sum=0;
scanf("%lld%lld",&n,&m);
for (i=2,sum=n;i<=m;i++){
sum=(sum+dbsl(i,n))%LEN;
}
printf("%lld",sum);
return 0;
}