4755. 快速荷叶叶变换
Posted traveller-ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4755. 快速荷叶叶变换相关的知识,希望对你有一定的参考价值。
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
对于 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 }
以上是关于4755. 快速荷叶叶变换的主要内容,如果未能解决你的问题,请参考以下文章