4755. 【NOIP2016提高A组模拟9.4】快速荷叶叶变换
Description
Input
一行,包含两个整数N,M。
Output
1个整数,FHT(N,M) mod 1000000007的值。
Sample Input
3 4
Sample Output
1
Data Constraint
对于 40% 的数据,1 ≤ N,M ≤ 1000
对于 60% 的数据,1 ≤ N,M ≤ 10^6
对于 100% 的数据,1 ≤ N,M ≤ 10^9
分析:原式可化为ΣΣ(n-n/i)(m-m/j),这个分块算一下即可。
代码
#include <cstdio>
#include <cmath>
#define ll long long
#define mo 1000000007
using namespace std;
ll n,m,ans;
ll ksm(ll a, ll b)
{
ll r = 1, base = a;
while (b)
{
if (b & 1) r = (r * base) % mo;
base = (base * base) % mo;
b>>=1;
}
return r;
}
ll sum(ll x)
{
ll s = 0;
ll i = 1;
while (i <= x)
{
int k = x / i;
int kk = x / k;
s = (s + k * (i + kk) * (kk - i + 1) % mo * ksm(2, mo - 2) % mo) % mo;
i = kk + 1;
}
s = ((x * x % mo - s) % mo + mo) % mo;
return s;
}
int main()
{
scanf("%lld%lld", &n, &m);
ll sumx = sum(n);
ll sumy = sum(m);
ans = sumx * sumy % mo;
printf("%lld", ans);
}