[日常练习]算

来源:互联网 发布:求数组最大最小值 编辑:程序博客网 时间:2024/06/05 06:57

【问题背景】

zhx帮他妹子做数学题。

【问题描述】

求:问题

如 N=3, M=3, 这个值为1^1+1^2+1^3+2^1+2^2+2^3+3^1+3^2+3^3=56。

【输入格式】

仅一行, 包含两个数 N和 M.

【输出格式】

仅一行, 包含所求的答案 mod10^9 +7的值。

【样例输入】

3 3

【样例输出】

56

【数据范围与规定】

对于50%的数据, 所有1≤ N,M ≤1000。对于100%的数据,所有1≤ N,M ≤50000。

直接利用等比数列求和公式可得
但是要用到逆元
由费马小定理得
x关于p的逆元为x^p-2

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MAX 1000000007#define LL long longusing namespace std;LL fastpow(LL x,LL t){    LL k=1,p;    while(t>1)    {        if(t%2==1) k=((k%MAX)*(x%MAX))%MAX;        t=t/2;              x=((x%MAX)*(x%MAX))%MAX;    }    x=((x%MAX)*(k%MAX))%MAX;    return x;} int n,m;LL i,ans,temp;int main(){    scanf("%d%d",&n,&m);    ans+=m;    for(i=2;i<=n;i++)    {        temp=(i*(fastpow(i,m)-1)%MAX*fastpow(i-1,MAX-2)%MAX)%MAX;        ans=(ans%MAX+temp%MAX)%MAX;    }    printf("%lld",ans);    return 0;}
原创粉丝点击