# [银联初赛]码队弟弟的求和(数论-分块求和)

[银联初赛]码队弟弟的求和(数论-分块求和)

题链(计蒜客)

  • 思路:
  • 平方之和公式:\(1^2+2^2+...+n^2=\frac{n*(n+1)*(2*n+1))}{6}\),前缀和处理
  • 分块求和思想:
    • \(\lfloor \frac{n}{i} \rfloor\)对于每一个值,可能有多个\(i\)对应,把这些\(i\)分在同一块,累加的时候直接使用乘积代替加法
int res=0;
for(int l=1,r;l<=n;l=r+1){
    r=n/(n/l);
    res+=(n/i*(r-l+1));//  n/i为块内每个数的值,同一个块都是相同的数值,(j-i+1)为块长
}
return res;

AcCode:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL n,m;
const LL mod=1e9+7;
LL qpow(LL a,LL b){
    LL ans=1;
    a%=mod;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
LL inv(LL a){
    return qpow(a,mod-2);
}
LL getans(LL n){
    return n*(n+1)%mod*(2*n+1)%mod*(inv(6))%mod;
}
LL cal(LL n){
    LL ans=(1+n)*n%mod*n%mod*inv(2)%mod;
//    bug(ans);
    LL b=0;
    for(LL i=1,j;i<=n;i=j+1){
        j=n/(n/i);
        b=b+(n/i)%mod*(getans(j)-getans(i-1))%mod;b%=mod;        //bug(b);
    }
    //bug(b);
    return (ans-b+mod)%mod;
}
int main(){
    //bug(qpow(2,10));
   // bug(getans(4)-getans(2));
    scanf("%lld%lld",&n,&m);
    cout<<cal(n)*cal(m)%mod<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/sstealer/p/11372352.html

时间: 2024-11-06 18:53:38

# [银联初赛]码队弟弟的求和(数论-分块求和)的相关文章

银联比赛-B自学图论的码队弟弟

开始第二题我以为考的是有向图,然后就没有写了,结果发现考的数学!!菜鸡就要有菜鸡的亚子!! 已知每条边的权值,然后求这个连通图的点的权值 额.....没错就是这个亚子了 加一个小知识点 原文地址:https://www.cnblogs.com/dingchenyang/p/11219197.html

UVa 1363 (数论 数列求和) Joseph&#39;s Problem

题意: 给出n, k,求 分析: 假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p 则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p 然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n / i)],n/i的整数部分相同,于是有了这份代码. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace

码队的新桌游

码队的新桌游 树状数组.离散化.二维偏序 #include <bits/stdc++.h> ///即找x.a<y.b<x.c&&y.a<x.b<y.c的组数 using namespace std; struct Item { int a, b, c; int id; int ans; explicit Item(int _a = 0, int _b = 0, int _c = 0) : a(_a), b(_b), c(_c) {} }; struct

数论分块 【数学】

数论分块 数论分块也是很重要哦(dalao说以后莫比乌斯反演要用到) 经典栗子: for i=1~n  求 ∑x=(n/i)  (注:这里()表示为下取整) 普通人一般暴力,复杂度 O(n) 这里就要用到数论分块. 我们可以模拟一下, 发现 x 在一定的区间内值不变. 这里就可以分块了.把值不变的每一块左端点.右端点算出来,就可以等差数列一起求和了. 这只是数论分块入门应用,后续待填坑... 推荐裸题:BZOJ2956 模积和 原文地址:https://www.cnblogs.com/Frank

数论分块与整除相

引理一 $$\forall a,b,c\in\mathbb{Z},\left\lfloor\frac{a}{bc}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor$$ 略证: \begin{split} &\frac{a}{b}=\left\lfloor\frac{a}{b}\right\rfloor+r(0\leq r<1)\\ \Rightarrow &\le

数论分块

数论分块大致用于处理形如求Σ(1,n)  (k div i) 的问题 打表易得,(k div i)的值是线性的,因为向下取整,所以会出现值成段的现象,这样我们原先暴力的O(n)的算法可以得到优化 首先我们要知道一个定理 对于(k div i)而言最多有2√k个取值 证明:对于 i (1 <= i <= n, 且 i 是整数)而言,i 可以分成两种情况 i <= √k , i 最多有 √k 个取值 i >= √k , 那么 (k div i)<= √k,最多有√k个取值 所以我

【bzoj2956】模积和 数论+分块

题目描述 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. 输入 第一行两个数n,m. 输出 一个整数表示答案mod 19940417的值 样例输入 3 4 样例输出 1 题解 数论+分块 由于直接求i≠j的情况比较难搞,所以我们可以先求出i可以等于j的和,然后再减去i等于j时的情况. 也就是求∑∑((n mod i)*(m mod j))-∑((n mod i)*(m mod i)). 然后再根据乘法分配律转化为∑(n mod i)*∑

SPOJ PGCD - Primes in GCD Table (好题! 莫比乌斯反演+分块求和优化)

PGCD - Primes in GCD Table Johnny has created a table which encodes the results of some operation -- a function of two arguments. But instead of a boring multiplication table of the sort you learn by heart at prep-school, he has created a GCD (greate

【BZOJ1257】余数之和(数论分块,暴力)

[BZOJ1257]余数之和(数论分块,暴力) 题解 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7 Input 输入仅一行,包含两个整数n, k. Output 输出仅一行,即j(n, k). Sample Input