4755. 快速荷叶叶变换

本文深入探讨了FHT算法的原理与应用,通过具体示例解析了算法的输入输出及约束条件,提供了高效的实现代码,包括等差数列求和的优化技巧,适用于大范围数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 * i 这样一来问题就变成了如何快速求解n/i * i ,我们发现n/i最多有根号n个值,并且相同的值肯定是连续一段的,这样我们就可以用等差数列求和。
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #define mo 1000000007
 5 #define LL long long
 6 using namespace std;
 7 LL n,m,ans1,ans2;
 8 
 9 LL Calc(LL n){
10     LL i=1,sum=0;
11     for(;i<=n;){
12         LL k=n/i,kk=n/k;
13         sum=(sum+k*(i+kk)*(kk-i+1)/2)%mo;
14         i=kk+1;
15     }
16     sum=((n*n%mo-sum)%mo+mo)%mo;
17     return sum;
18 }
19 
20 int main(){
21     scanf("%lld%lld",&n,&m);
22     ans1=Calc(n);
23     ans2=Calc(m);
24     cout<<(ans1*ans2)%mo;
25 }
View Code

 

转载于:https://www.cnblogs.com/traveller-ly/p/9651081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值