1. 程式人生 > >等比數列求和和求模的高階運用(程式設計題)

等比數列求和和求模的高階運用(程式設計題)

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