题目连接
美味果冻
思路
交换枚举项j,就是把分母作为枚举项,然后利用等差数列求和公式以及维护次方数组来完成对第二块的计算,如果用快速幂的话复杂度回事nlognlogn,所以这题不能用快速幂,必须维护次方数组。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<bits/stdc++.h> using namespace std; #define ll long long const int md = 1e9+7; const int maxn = 3e6+10; int mul[maxn]; ll sum(ll l,ll r){return ((l+r)*(r-l+1)/2)%md;} int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++)mul[i]=1; ll ans = 0; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j+=i) { mul[j/i]=(1ll*mul[j/i]*(j/i))%md; ans=(ans+sum(j,min(j+i-1,n))*mul[j/i])%md; } } cout<<ans<<endl; }
|