@Simon-Sun
2022-06-09T13:56:25.000000Z
字数 6217
阅读 381
未分类
如果你做题见到好多个,例如:
数论是研究整数的。
既然是整数而不是实数那么他就有一些奇怪的性质。
其中一个性质便是除法向下取整。
比如说::
当 已知
要满足
ll t,n,ans;int main(){t=read();while(t--) {n=read();ans=0;ll l=1, r;\\从1开始while(l<=n) {r=n/(n/l);//这是l的块的右端点ans+=(r-l+1)*(n/l);//直接区间求和l=r+1;//下一个块}printf("%lld\n", ans);}}
很简单吧, 很好理解吧。
我们是一个个块枚举的,所以复杂度就是有几个块算几次。
相同的值算一个块,那么就看 有几种取值就行。
①当
就算 互不相同,
撑死 种取值。
②当
所以也是撑死只有 个取值
总共撑死只有 个块。
所以复杂度
比如
r=n/(n/l);->r=min(n/(n/l), m/(m/l));
二维以上同理。
就这么点东西,就这么简单~
一个很神奇的东西。
两个数论函数 ,,我们定义,不要问为啥,就是定义,其狄利克雷卷积为:
直接上:
设
接下来正式开始学习。
首先你要知道几个定义:
我们设:
我们可以直接利用狄利克雷卷积来表示:
void Euil() {mu[1]=1;for(int i=2; i<=1000000; ++i) {if(!pd[i]) {zhi[++top]=i;mu[i]=-1;//一个质数(-1)^1}for(int j=1; j<=top&&zhi[j]*i<=1000000; ++j) {pd[zhi[j]*i]=1;if(i%zhi[j]==0) break;else mu[zhi[j]*i]=-mu[i];//一个新的质数。}}for(int i=1; i<=1000000; ++i) {mu[i]+=mu[i-1];}}int main(){n=read();for(int k=1; k<=n; ++i) {int l=1, r;int nn=n/k;while(l<=nn) {r=nn/(nn/l);int p=nn/l;ans+=k*p*p*(mu[r]-mu[l-1]);l=r+1;}} printf("%d", ans);}
特别鸣谢, @Konnyaku41377 提供的详细理论及知识点讲解
感谢大家的阅读,多多点赞哟~