zoukankan      html  css  js  c++  java
  • 【洛谷P3708】koishi的数学题

    题目

    题目链接:https://www.luogu.com.cn/problem/P3708
    Koishi 在 Flandre 的指导下成为了一名数学大师,她想了一道简单的数学题。
    输入一个整数 (n),设 (displaystyle f(x) = sum_{i=1}^n x mod i),你需要输出 (f(1), f(2), ldots , f(n))
    按照套路,Koishi 假装自己并不会做这道题,就来求你帮忙辣。

    思路

    考虑每一个 (i) 作为模数的贡献。发现它对 (f) 造成的贡献是

    [0,1,2,···,i-2,i-1,0,1,2,···i-2,i-1,··· ]

    也就是对于区间 ([ki,(k+1)i)) 是分别贡献了 (1sim i-1),设 (f) 一开始全部是 (1),可以枚举 (i) 的每一个倍数,在 (i) 倍数位置减去 (i),然后做一遍前缀和就是 (f) 了。
    对于每一个 (i) 跑一遍,时间复杂度 (O(nlog n))

    思路

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int N=1000010;
    ll n,f[N];
    
    int main()
    {
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++)
    		for (int j=i;j<=n;j+=i)
    			f[j]-=i;
    	for (int i=1;i<=n;i++)
    	{
    		f[i]+=f[i-1]+n;
    		printf("%lld ",f[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    WQS二分
    虚树
    洛谷集训队题单Part1
    动态点分治
    点分治
    最小乘积模型
    线段树分治
    分层图最短路
    学长学姐们的测试-2
    线性dp
  • 原文地址:https://www.cnblogs.com/stoorz/p/13897532.html
Copyright © 2011-2022 走看看