首页 > 其他分享 >[国家集训队] Crash的数字表格 / JZPTAB

[国家集训队] Crash的数字表格 / JZPTAB

时间:2024-09-13 15:04:14浏览次数:1  
标签:lfloor frac JZPTAB sum min rfloor Crash 国家集训队 displaystyle

[国家集训队] Crash的数字表格 / JZPTAB

题目描述

今天的数学课上,Crash 小朋友学习了最小公倍数(Least Common Multiple)。对于两个正整数 \(a\) 和 \(b\),\(\text{lcm}(a,b)\) 表示能同时被 \(a\) 和 \(b\) 整除的最小正整数。例如,\(\text{lcm}(6, 8) = 24\)。

回到家后,Crash 还在想着课上学的东西,为了研究最小公倍数,他画了一张 $ n \times m$ 的表格。每个格子里写了一个数字,其中第 \(i\) 行第 \(j\) 列的那个格子里写着数为 \(\text{lcm}(i, j)\)。

看着这个表格,Crash 想到了很多可以思考的问题。不过他最想解决的问题却是一个十分简单的问题:这个表格中所有数的和是多少。当 \(n\) 和 \(m\) 很大时,Crash 就束手无策了,因此他找到了聪明的你用程序帮他解决这个问题。由于最终结果可能会很大,Crash 只想知道表格里所有数的和对 \(20101009\) 取模后的值。

输入格式

输入包含一行两个整数,分别表示 \(n\) 和 \(m\)。

输出格式

输出一个正整数,表示表格中所有数的和对 \(20101009\) 取模后的值。

样例 #1

样例输入 #1

4 5

样例输出 #1

122

提示

样例输入输出 1 解释

该表格为:

\(1\) \(2\) \(3\) \(4\) \(5\)
\(2\) \(2\) \(6\) \(4\) \(10\)
\(3\) \(6\) \(3\) \(12\) \(15\)
\(4\) \(4\) \(12\) \(4\) \(20\)

数据规模与约定

  • 对于 \(30\%\) 的数据,保证 \(n, m \le 10^3\)。
  • 对于 \(70\%\) 的数据,保证 \(n, m \le 10^5\)。
  • 对于 \(100\%\) 的数据,保证 \(1\le n,m \le 10^7\)。

链接

\(\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^m\frac{ij}{gcd(i,j)}\)

\(\displaystyle\sum_{d=1}^{min(n,m)}\displaystyle\sum_{i=1}^{\frac{n}{d}}\displaystyle\sum_{j=1}^{\frac{m}{d}}i*j*d[gcd(i,j)=1]\),\(\displaystyle\sum_{d=1}^{min(n,m)}d\displaystyle\sum_{i=1}^{\frac{n}{d}}\displaystyle\sum_{j=1}^{\frac{m}{d}}i*j*\epsilon(gcd(i,j)=1)\)

\(\displaystyle\sum_{d=1}^{min(n,m)}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*\displaystyle\sum_{e|gcd(i,j)}\mu(e)\)
\(\displaystyle\sum_{d=1}^{min(n,m)}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*\displaystyle\sum_{e=1}^{min(i,j)}\mu(e)[e|i][e|j]\)

\(\displaystyle\sum_{d=1}^{min(n,m)}d\displaystyle\sum_{e=1}^{min(n,m)}\mu(e)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i*[e|i]\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}j*[e|j]\)

\(\displaystyle\sum_{d=1}^{min(n,m)}d\displaystyle\sum_{e=1}^{min(n,m)}\mu(e)\times e^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{de}\rfloor}i\displaystyle\sum_{j=1}^{\lfloor\frac{m}{de}\rfloor}j\)

把后面的部分拿出来。设\(sum(n,m)=\displaystyle\sum_{e=1}^{min(n,m)}\mu(e)\times e^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{e}\rfloor}i\displaystyle\sum_{j=1}^{\lfloor\frac{m}{e}\rfloor}j\)
前面的部分的\(\mu(e)*e^2\)的前缀和可以用埃式筛\(O(n\log\log n)\)预处理,然后可以发现,后面的部分在\(e\)属于一个相邻的连续范围内的时候是不会变化的,这个范围就是整除分块的范围。这样整个\(sum\)函数就可以用整除分块在\(O(\sqrt n)\)的时间处理。
所以式子变为\(\displaystyle\sum_{d=1}^{min(n,m)}d\times sum(\lfloor\frac {n}{d}\rfloor,\lfloor\frac {m}{d}\rfloor)\),又可以发现,\(\lfloor\frac {n}{d}\rfloor\)在\(d\)变化时在一定范围内不变,可以整除分块。所以两个整除分块就好了。

预处理的时间复杂度应该没问题。。但是两个整除分块的嵌套的复杂度真的没事情吗...

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read()
{
    char c=getchar();ll a=0,b=1;
    for(;c<'0'||c>'9';c=getchar())if(b=='-')b=-1;
    for(;c>='0'&&c<='9';c=getchar())a=a*10+c-'0';
    return a*b;
}
const ll N=1e7,P=20101009;
ll prime[N+1],vis[N+1],cnt,mu[N+1],sum[N+1],n,m;
void init()
{
    mu[1]=1;
    for(ll i=2;i<=min(n,m);i++)
    {
        if(!vis[i])prime[++cnt]=i,mu[i]=-1;
        for(ll j=1;j<=cnt&&i*prime[j]<=min(n,m);j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                mu[i*prime[j]]=0;
                break;
            }
            mu[i*prime[j]]=mu[i]*mu[prime[j]];
        }
    }
    for(ll i=1;i<=min(n,m);i++)
    {
        sum[i]=(sum[i-1]%P+i*i%P*(mu[i]+P)%P)%P;
    }
}
ll count(ll n,ll m)
{
    return (((1LL*(n+1)*(n)/2) %P) *(1LL*(m+1)*(m)/2%P)%P) %P;
}
ll Sum(ll n,ll m)
{
    ll ans=0;
    for(ll l=1,r=0;l<=min(n,m);l=r+1)
    {
        r=min(n/(n/l),m/(m/l));
        ans=(ans+((sum[r]-sum[l-1])+P)%P*(count(n/l,m/l)%P))%P;
    }
    return ans;
}
int main()
{
    n=read(),m=read();
    init();
    ll ans=0;
    for(ll l=1,r=0;l<=min(n,m);l=r+1)
    {
        r=min(n/(n/l),m/(m/l));
        ans=(ans+(((r+l)*(r-l+1)/2)%P*Sum(n/l,m/l)%P)%P)%P;
    }
    cout<<ans%P<<endl;
    return 0;
}

跑的挺快...
玛德跳了2两个小时,就因为一个部分的式子写错了,然后刚刚好的没有算错,而是导致了大数据时取模会爆炸。我草我草我草我草受不了了。

标签:lfloor,frac,JZPTAB,sum,min,rfloor,Crash,国家集训队,displaystyle
From: https://www.cnblogs.com/HLZZPawa/p/18412206

相关文章

  • 题解 P4827【[国家集训队] Crash 的文明世界】
    从阶乘幂到斯特林数-caijianhong-博客园(cnblogs.com)题目描述Crash小朋友最近迷上了一款游戏——文明5(CivilizationV)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个\(n\)个城市的国家,这......
  • 1.9 Crash(三,Ramdump的分析)
    写在前面前面我们介绍了triggerfullsystemcrash的常见的五种类型。那么接下来我们来分析下,如何从解析Ramdump的产物中来分析为是哪一种类型,进而一步步找出问题的根因。无论是使用QCAP查看TZ_Counters.txt,还是使用qnx_host_ramdump_parser.py解析查看tz_diag.txt中RESETIN......
  • Android使用addr2line分析Native Crash
    NDK提供的工具将函数地址解析为具体的函数名和行数才能进一步分析问题。常用的地址转换工具有addr2line、ndk-stack等,个人比较喜欢addr2line,所以接下来介绍下该工具的基本使用方式日常使用过程中,只需要关注-C-f-e三个参数即可//-C:Demangle函数名//-f:显示函数名//......
  • crash查看percpu变量在每个cpu上的基地址和内容
    查看percpu变量在每个cpu上的基地址 crash>kmem-oPER-CPUOFFSETVALUES:CPU0:ffff88807f600000CPU1:ffff88807fa00000CPU2:ffff88813d600000CPU3:ffff88813da00000CPU4:ffff8881bd600000CPU5:ffff8881bda00000CPU6:ffff88823d600000CPU......
  • dlopen 加载使用了std::thread 的so 导致crash的问题分析
    c++11的的createimplement是在thread.cc中实现的,这意味着创建代码在libstdc++.so中,创建代码需要使用与平台有关的apigcc(g++isapartofgcc)的预期:没有调用的thread的代码,不会产生对pthread的依赖,更重要的,不同配置的gcc的线程模型是不同的,依赖库也不同(即不一定是pthrea......
  • CrashCourse CS 速成课笔记
    1.计算机早期历史算盘>>步进计算器>>差分机>>分析机>>打孔卡片制表机CharlesBabbage,AdaLoyelace最早的计算设备是算盘。Computer从指代职业变成指代机器机器里有名的是:步进计算器,第一个可以做加减乘除的机器炮弹为了精准,要计算弹道,二战是查表来做。但每次......
  • crash+awk:统计vma的大小
    正常的vm命令输出:crash_new>vmPID:2380TASK:ffffff88414bddc0CPU:5COMMAND:"xxx"MMPGDRSSTOTAL_VMffffff880a997c00ffffff882574700016565804k44535380kVMASTARTENDFLAG......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......
  • SP8099 TABLE - Crash´s number table 题解
    题目传送门前置知识一般的积性函数|数论分块|莫比乌斯反演解法令\(n\lem\)。考虑莫比乌斯反演,推式子,有\(\begin{aligned}&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\operatorname{lcm}(i,j)\\&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{ij}{\gcd(i,j)......
  • Crash Course Computer Science
    【计算机科学速成课】[40集全/精校]-CrashCourseComputerScienceep1.EarlyComputingCharlesBabbageEnglishmathematicianandinventorconceivedthefirstautomaticdigitalcomputerAdaLovelaceEnglishmathematicianthefirstcomputerprogramme......