P2260 [清华集训2012]模积和

整除分块+逆元

详细题解移步P2260题解板块

式子可以拆开分别求解,具体见题解

这里主要讲的是整除分块(数论分块)mod不为素数时如何求逆元

整除分块:求Σ「n/i」(i=1~n),「」表示向下取整

由于「n/i」在某段区间内都有相同的值,所以可以分块算,复杂度O( sqrt(n) )

code:

ll res=;
for(ll l=,r;l<=n;l=r+){
  r=n/(n/l);
  res=res+(r-l+)*(n/l);
}
return res;

当mod是素数时,我们可以用费马小定理直接算,但是mod不为素数时,我们就可以用欧拉函数算(定义等右转Baidu)

当n,p互素时,n在 mod p 下的乘法逆元为 n^(phi(p)-1)

当n,p不互素时,并没有乘法逆元233333

特别地,当p为素数时,phi(p)=p-1,恰好是费马小定理

本人能力限制,不给出证明(逃

当所求逆元的数事先指定时,可以用暴力法(比如本题只需求2,6的逆元)

下面给出暴力法和欧拉函数的code:

#include<bits/stdc++.h>
using namespace std;
const int mod=;
template <typename T> int find_inv(T x){ //暴力预求
for(int i=;i<=;++i) //自行规定范围
if(1LL*x*i%mod==) //根据定义
return i;
}
template <typename T> int _phi(T x){ //欧拉函数计算
int k=sqrt(x),phi=x;
for(int i=;i<=k;++i)
if(x%i==){
phi=phi/i*(i-);
while(x%i==) x/=i;
}
if(x>) phi=phi/x*(x-);
return phi;
}
int ksm(int x,int y){
int res=;
for(;y;y>>=){
if(y&) res=1LL*res*x%mod;
x=1LL*x*x%mod;
}return res;
}
int main(){
cout<<find_inv()<<" "<<find_inv()<<endl;
int phi=_phi(mod);
cout<<ksm(,phi-)<<" "<<ksm(,phi-);
//2->9970209 6->3323403
return ;
}

接下来就是本题的code了

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;}
const int mod=;
ll n,m,ans;
inline ll sum1(ll l,ll r) {return (l+r)*(r-l+)%mod*%mod;} //求等差数列
inline ll sum2(ll x) {return x*(x+)%mod*(x*+)%mod*%mod;} //求1^2+2^2+3^2+...+x^2
inline ll calc(ll x){ //整除分块(根据题意稍作修改)
ll res=;
for(ll l=,r;l<=x;l=r+) r=x/(x/l),res=(res+(r-l+)*x-sum1(l,r)*(x/l)+mod)%mod;
return res;
}
int main(){
scanf("%lld%lld",&n,&m); if(n>m) swap(n,m);
ans=calc(n)*calc(m)%mod; ll s1,s2,s3;
for(ll l=,r;l<=n;l=r+){
r=min(n/(n/l),m/(m/l));
s1=n*m%mod*(r-l+)%mod;
s2=(n/l*m+m/l*n)%mod*sum1(l,r)%mod;
s3=(n/l)*(m/l)%mod*(sum2(r)-sum2(l-)+mod)%mod;
ans=(ans-(s1-s2+s3+mod)%mod+mod)%mod; //式子拆分后分别求解
}printf("%lld",ans);
return ;
}

P2260 [清华集训2012]模积和的更多相关文章

  1. P2260 [清华集训2012]模积和 【整除分块】

    一.题目 P2260 [清华集训2012]模积和 二.分析 参考文章:click here 具体的公式推导可以看参考文章.博主的证明很详细. 自己在写的时候问题不在公式推导,公式还是能够比较顺利的推导 ...

  2. 洛谷 P2260 [清华集训2012]模积和 || bzoj2956

    https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...

  3. 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)

    题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...

  4. luoguP2260 [清华集训2012]模积和

    题意 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}n\%i*m\%j*[i!=j]\) \(\sum\limits_{i=1}^{n}\sum\limits ...

  5. BSOJ 4062 -- 【清华集训2012】串珠子

    Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...

  6. Luogu P4247 [清华集训2012]序列操作

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(q\) 次操作,每次操作形如以下三种: I a b c,表示将 \([a,b]\) 内的元素加 \(c\). R a b,表示将 \([a ...

  7. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

  8. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  9. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

随机推荐

  1. hdu3065 病毒侵袭持续中【AC自动机】

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. poj2492 A Bug's Life【并查集】

    Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assume ...

  3. CodeForces - 586C Gennady the Dentist 模拟(数学建模的感觉)

    http://codeforces.com/problemset/problem/586/C 题意:1~n个孩子排成一排看病.有这么一个模型:孩子听到前面的哭声自信心就会减弱:第i个孩子看病时会发出v ...

  4. linux:正则表达式grep命令

    基本语法一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串. 一.选择:| |   竖直分隔符表示选择,例如"boy|girl"可 ...

  5. 洛谷P4035 球形空间产生器 [JSOI2008] 高斯消元

    正解:高斯消元 解题报告: 链接! 昂开始看到以为是,高斯消元板子题? 开始很容易想到的是,虽然是多维但是可以类比二维三维列出式子嘛 但是高斯消元是只能处理一元问题的啊,,,辣怎么处理呢 对的这就是这 ...

  6. Redis添加历史浏览记录

    参考资料 http://redisdoc.com/index.html http://redis-py.readthedocs.io/en/latest/#indices-and-tables 1.什 ...

  7. Java非静态内部类为什么不能有静态成员

    我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所 ...

  8. 常用python包(依赖)Ubuntu下

    amqp==1.4.9anyjson==0.3.3apturl==0.5.2beautifulsoup4==4.4.1billiard==3.3.0.23blinker==1.3Brlapi==0.6 ...

  9. mysql 数据库的操作

    1.数据库的查看 1)查看mysql中所有的数据库    "show databases;" mysql> show databases; +---------------- ...

  10. read 命令

    read 用来接收标准输入 #!/bin/bash read -t -p "Please input a number:" number echo $number //把键盘输入的 ...