首页 > 其他分享 >2024-03-22

2024-03-22

时间:2024-03-22 22:15:30浏览次数:25  
标签:lfloor 03 frac 22 bmod ll 2024 sum mod

\({\color{orange}\star}\) 2024-03-22 \({\color{orange}\star}\)

模积和

# 题目描述 #

\[\sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j \]

\(\bmod 19940417\) 的值

# Solution #

不妨设 \(n\le m\)

容斥原理

\[\sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j \newline \]

\[=\sum_{i=1}^n\sum_{j=1}^m(n\bmod i)\times(m\bmod j)-\sum_{i=1}^n(n\bmod i)(m\bmod i) \]

两个和式拆开计算

\[\sum_{i=1}^n\sum_{j=1}^m(n\bmod i)\times(m\bmod j) \newline =\sum_{i=1}^n(n\bmod i)\sum_{j=1}^m(m\bmod j) \newline \]

\[=\sum_{i=1}^n(n-\left\lfloor\frac{n}{i}\right\rfloor\times i)\sum_{j=1}^m(m-\left\lfloor\frac{m}{j}\right\rfloor\times j) \newline =(n^2-\sum_{i=1}^ni\times\left\lfloor\frac{n}{i}\right\rfloor)(m^2-\sum_{j=1}^mj\times\left\lfloor\frac{m}{j}\right\rfloor) \]

\[\sum_{i=1}^n(n\bmod i)(m\bmod i) \newline =\sum_{i=1}^n(n-\left\lfloor\frac{n}{i}\right\rfloor\times i)(m-\left\lfloor\frac{m}{i}\right\rfloor\times i) \newline \]

\[=\sum_{i=1}^n(nm-ni\times\left\lfloor\frac{m}{i}\right\rfloor-mi\times\left\lfloor\frac{n}{i}\right\rfloor+i^2\times\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor) \]

数论分块
用于计算形如

\[\sum_{i=1}^nf(i)\left\lfloor\frac{n}{i}\right\rfloor \]

的和式
其中 \(f(i)\) 可以快速求出区间和
当 \(i\) 从 \(1\) 取到 \(n\) 时,\(\left\lfloor\frac{n}{i}\right\rfloor\) 的取值不超过 \(2\sqrt{n}\) 种(证明 见 OI-Wiki)
这样我们就可以把 \(\left\lfloor\frac{n}{i}\right\rfloor\) 取值相同的区间放到一起处理

\(i\) 所在的区间的右端点为 \(\left\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\right\rfloor\)

拆成五个部分用数论分块

时间复杂度 \(O(\sqrt{n})\)

#include<iostream>
#include<cstring>
#include<algorithm>

#define mod 19940417

using namespace std;

typedef long long ll;

const ll inv2=9970209,inv6=3323403;

ll n,m;

ll calc1(ll x) {
	ll l=1,r,res=0;
	while(l<=x) {
		r=min(x/(x/l),x);
		res=(res+(l+r)*(r-l+1)%mod*inv2%mod*(x/l)%mod)%mod;
		l=r+1;
	}
	return res;
}

ll calc2(ll x,ll y) {
	ll l=1,r,res=0;
	while(l<=n) {
		r=min(y/(y/l),n);
		res=(res+x*(l+r)%mod*(r-l+1)%mod*inv2%mod*(y/l)%mod)%mod;
		l=r+1;
	}
	return res;
}

ll calc3() {
	ll l=1,r,res=0;
	while(l<=n) {
		r=min(n,min(n/(n/l),m/(m/l)));
		res=(res+((r*(r+1)%mod*(2*r%mod+1)%mod-(l-1)*l%mod*(2*l%mod-1)%mod)%mod+mod)%mod*inv6%mod*(n/l)%mod*(m/l)%mod)%mod;
		l=r+1;
	}
	return res;
}

int main() {
	scanf("%lld%lld",&n,&m);
	if(n>m) swap(n,m);
	ll A=((n*n%mod-calc1(n))%mod+mod)%mod,B=((m*m%mod-calc1(m))%mod+mod)%mod;
	ll ans=((A*B%mod-n*n%mod*m%mod)%mod+mod)%mod;
	ll C=calc2(m,n),D=calc2(n,m);
	ans=((ans+C)%mod+D)%mod;
	ll E=calc3();
	ans=((ans-E)%mod+mod)%mod;
	printf("%lld\n",ans);
	
	return 0;
} 

tips:

  1. \(a\bmod b\) 有时候可以转化为 \(a-\left\lfloor\frac{a}{b}\right\rfloor\times b\)
  2. \(\sum_{i=1}^k i^2=\frac{k(k+1)(2k+1)}{6}\)
  3. 所有的运算都要取模!

礼物

准备学 exLucas
结果学长们说 exLucas 不用学,没用
那就不做这题了

但是看懂了 Lucas 的证明,也算有点收获吧

聪明的燕姿

# 题意 #

求所有 所有约数的和 为 \(S\) 的数

唯一分解定理:

\[x=\prod_{i=1}^k{p_i}^{\alpha_i} \]

一个数的所有约数的和:

\[s=\prod_{i=1}^k(\sum_{j=0}^{\alpha_i}{p_i}^j) \]

然后暴搜就行了

s 表示当前还能搜多少,k 表示 当前从第 k 个质数开始枚举(保证质数从小到大),w 表示当前的数是多少

  • 枚举上限:因为从小到大, \((p_i+1)^2<(p_i+1)(p_j+1)\le s\)
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long ll;

const int N=100005;

ll S;

ll primes[N],cntp;
bool st[N];

void initp() {
	st[0]=st[1]=true;
	for(ll i=2;i<=100000;i++) {
		if(!st[i]) primes[++cntp]=i;
		for(ll j=1;i*primes[j]<=100000;j++) {
			st[i*primes[j]]=true;
			if(i%primes[j]==0) break;
		}
	}
}

ll ans[N],cnta;

bool isp(int x) {
	if(x<2) return false;
	for(int i=2;i*i<=x;i++) if(x%i==0) return false;
	return true;
}

void dfs(ll s,ll k,ll w) {
	if(s==1) {
		ans[++cnta]=w;
		return;
	}
	if(isp(s-1)&&s>primes[k]) ans[++cnta]=w*(s-1);
	for(ll i=k;primes[i]*primes[i]<=s;i++) {
		ll pw=primes[i],sm=primes[i]+1;
		while(sm<=s) {
			if(s%sm==0) dfs(s/sm,i+1,w*pw);
			pw*=primes[i];
			sm+=pw;
		}
	}
}

int main() {
	initp();
	while(scanf("%lld",&S)!=EOF) {
		cnta=0;
		dfs(S,1,1);
		sort(ans+1,ans+cnta+1);
		printf("%lld\n",cnta);
		for(int i=1;i<=cnta;i++) printf("%lld ",ans[i]);
		if(cnta) puts("");
	}
	
	return 0;
}

圆上的整点

看题解区有一个视频,看了半个小时讲的复数高斯素数啥的没听懂,感觉没用,不做了

今天被好多没营养的题浪费时间了

骗我呢

任老师说这题挺好的

但我不会

看解析看了一个多小时,终于看明白了

没时间了,简单写思路

先推个DP
发现一行有 m 个数,单调增,共有 0~m m+1 种取值
说明每行只有一个数没有出现

f[i][j] 为第 i 行没有出现的数是 j 的方案数

不难发现 f[i][j]=f[i-1][0]+f[i-1][1]+...+f[i-1][j+1]

可以优化成 f[i][j]=f[i][j-1]+f[i-1][j+1]

把转移关系化成箭头,斜的不好看,“推开”成横平竖直的

答案可以转化为 平面上 从 (0, 0) 到 (n+m+1, n) 的路径数,其中路径不能碰到 y=x+1, y=x-m-2 两条直线(这里想了很久)

然后容斥

  • 不考虑限制 从 (0, 0) 到 (x, y) 的路径数 为 \(x+y\choose x\) 代表一共要走 x+y 次,选 x 次 向右走

然后减去什么以A开头的和以B开头的
翻转之类的(这好像在这种不经过某直线路径数的时候很常见,卡特兰数一样)

具体看题解吧,反正我搞懂了,要回宿舍了没时间写了

C(n,m) 函数坑了我两次了

  1. 记得 n<m 的时候返回 0
  2. 记得 n<0 或 m<0 的时候返回 0
#include<iostream>
#include<cstring>
#include<algorithm>

#define mod 1000000007 

using namespace std;

typedef long long ll;

const int N=5e6+100;

int n,m;
ll fact[N];

ll qpow(ll a,ll k,ll p) {
	ll res=1;
	while(k) {
		if(k&1) res=res*a%p;
		a=a*a%p,k>>=1;
	}
	return res;
}

ll C(ll n,ll m,ll p) {
	if(n<0||m<0) return 0;
	if(n<m) return 0;
	return fact[n]*qpow(fact[m],mod-2,mod)%mod*qpow(fact[n-m],mod-2,mod)%mod;
}

void trans(ll &x,ll &y,ll a) {
	swap(x,y);
	x-=a,y+=a;
}

int main() {
	scanf("%d%d",&n,&m);
	fact[0]=1;
	for(ll i=1;i<=3e6+100;i++) fact[i]=fact[i-1]*i%mod;
	int ans=C(n+m+1+n,n,mod);
	ll x=n+m+1,y=n;
	while(x>=0&&y>=0) {
		trans(x,y,1);
		ans=((ans-C(x+y,x,mod))%mod+mod)%mod;
		trans(x,y,-m-2);
		ans=(ans+C(x+y,x,mod))%mod;
	}
	x=n+m+1,y=n;
	while(x>=0&&y>=0) {
		trans(x,y,-m-2);
		ans=((ans-C(x+y,x,mod))%mod+mod)%mod;
		trans(x,y,1);
		ans=(ans+C(x+y,x,mod))%mod;
	}
	printf("%d\n",ans); 
	
	return 0;
}

标签:lfloor,03,frac,22,bmod,ll,2024,sum,mod
From: https://www.cnblogs.com/Orange-Star/p/18088988

相关文章

  • BZOJ5223-有理有据题
    BZOJ5223-有理有据题题目大意给你\(m\)条线段\((a_i,b_i)\),再给\(n\)个区间\([l_i,r_i]\),\(q\)次操作,\(\texttt{Axy}\)添加一条线段\((x,y)\),其编号为最后一条线段加一。\(\texttt{Cx}\)查询\([l_x,r_x]\)和线段有交集(在边界点也算)的最长编号区间。\(\texttt......
  • 3.22
    写完镍、锡、氧化铝和黄金的数据展示表和价格可视化      ......
  • 20212217刘恒谦-Exp2 后门原理与实践
    实践过程记录使用netcat获取主机操作Shell,cron启动​ ncat即Netcat,可以收发传输层数据,由攻击者使用。cron是Linux中用于按计划执行脚本的工具,在网络对抗中让受害者连接不稳定时,重连攻击者,由受害者启动。​ 既然如此,受害者需要是Linux,否则没有cron命令,我购买了一台阿里云Ubuntu......
  • STM32G431RBT6之LCD03
    导入三个文件lcd.c&&lcd.h&&fonts.h  初始化&&界面显示LCD_Init();LCD_Clear(Black);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);chartemp[20];LCD_DisplayStringLine(Line1,(u8)"DATA");spri......
  • 3.22
    MinimumSpanningTrees给定一张\(n\)个点的完全图,每条边有\(p_0\)的概率不存在,\(\forall1\lei\lek\),有\(p_i\)的概率边权为\(i\),求所有可能总权值的概率.\(n\le40,k\le4\)数据严重偏小了似乎.\(f_{i,j,k}\)表示权值为\(1-i\)的边,\(j\)个有标号点组成的权......
  • [周报]线性代数和SAM 2024年3月第3周
    算法笔记线性代数线代题不多,但是都很有些难度.当然OI中的线性代数存在很大程度上的"只取所需"的情况.高斯消元,线性(异或)基加上矩阵优化DP,基本上就是最多的一个运用了.高斯消元道理就是初中数学,解多元一次方程组.其实这种用方程组来理解线代是个挺直观的方法.比如向量张成......
  • 2024中考记录
    写篇博客记录下中考倒计时一百天发生的事,有空就更新。开始时间:\(2024.3.22\),距离中考一百天。\(Day\)-100从昨天开始月考,校内一模,和综合排名有关。第一天,英语难!!!,平时写的作业太水了,智商直接退化。化学考前听说很难,实际体验还好,时间分配垃圾,差点没写完。本来是二十分结束,记错......
  • 从ICAC 2024聊聊CIM trend
    从ICAC2024聊聊CIMtrend刚参加完今年在上海举办的ICAC2024,体验很好,从各位老师同学处学到很多。我是做CIM的,所以两个CIMSession一个不落,另外因为对Processor感兴趣,EffientDigitalCircuitSession和LowPowerSoCSession也去学习了一下。因为大部分工作在ISSCC上已经了解过......
  • 20240322打卡
    第四周第一天第二天第三天第四天第五天第六天第七天所花时间1h5h3h1.5h0h代码量(行)2123592745470博客量(篇)11111知识点了解Kotlin编写用户注册与登录功能jetpack的深入使用hilt依赖注入与kotlin协程等知识了解蓝桥杯题目练习osu......
  • 3.22毕设
    mybatisplus自动生成增删改查的代码,首先引入相关的依赖,代码生成器分为新版本和旧版本,我这里使用的时旧版本的 然后创建一个类,导入模板代码,再对内容进行细致的配置 运行之后只需要输入表名,调用mp提供的增删改查代码进行自己的操纵,下面是生成的项目目录  ......