【NOIP模拟】算循环

Description

【NOIP模拟】算循环_第1张图片

Solution

这题很简单。
分别考虑每个点的贡献。
ans=xy(nx+1)(ny+1)
那么拆一下,就是x和y的答案分别乘起来。
比如说x的答案: x(n+1)xx
那么用一下平方和公式和等差数列求和就好了。

Code

#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const ll mo=1000000007,er=500000004,liu=166666668;
ll i,j,k,l,t,n,m,ans,ans1;
ll ph(ll n){
    n=n%mo;
    ll z=n*(n+1)%mo*(2*n%mo+1)%mo*liu%mo;
    return z;    
}
ll dc(ll n){
    n=n%mo;
    ll z=n*(n+1)%mo*er%mo;
    return z;    
}
int main(){
    freopen("loop.in","r",stdin);
    freopen("loop.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    ans=((n+1)%mo*dc(n)%mo-ph(n)+mo)%mo;
    ans1=((m+1)%mo*dc(m)%mo-ph(m)+mo)%mo;
    ans=ans*ans1%mo;
    printf("%lld\n",ans);
}

你可能感兴趣的:(noip,数论)