UVa 1363 Joseph's Problem (等差数列)

题目

题目大意

输入正整数\(n\)和\(k\)(\(1 ≤ n, k ≤ 10^9\)), 计算\(\sum_{i = 1}^{n}k\ mod\ i\)。

题解

被除数固定, 除数逐次加\(1\), 直观上余数也应该有规律: 对于某一个区间\(i, i + 1, i + 2, \cdots , j\), 如果\(k\)除以它们的商的整数部分都相同, 则\(k\)除以它们的余数会是一个等差数列。

这样就就可以在枚举\(i\)的时候把它所在的等差数列之和累加到答案中, 大大降低了时间复杂度。

代码

#include <cstdio>
#include <algorithm>
long long n, k;
long long ans, i;
int main(int argc, char const *argv[]) {
  while (~scanf("%lld %lld", &n, &k)) {
    ans = std::max(n - k, 0ll) * k, i = 1;
    for (register long long l, r; i * i <= k; ++i) {
      l = k / (i + 1) + 1,
      r = std::min(n, k / i);
      if (l <= r) {
        ans += ((k % r + k % l) * (r - l + 1)) >> 1;
      }
    }
    for (i = std::min(n, k / i); i; --i) ans += k % i;
    printf("%lld\n", ans);
  }
  return 0;
}

UVa 1363 Joseph's Problem (等差数列)

原文地址:https://www.cnblogs.com/forth/p/9724287.html

时间: 2024-10-08 20:04:52

UVa 1363 Joseph's Problem (等差数列)的相关文章

UVA 1363 Joseph&#39;s Problem

https://vjudge.net/problem/UVA-1363 n 题意:求 Σ  k%i i=1 除法分块 如果 k/i==k/(i+1)=p 那么 k%(i+1)=k-(i+1)*p= k-i*p-p = k%i-p 所以 商相同时,余数为等差数列 我不知道为什么交到vjudge一直WA,网上搜的题解交上去也WA #include<cmath> #include<cstdio> using namespace std; int main() { int n,k,i,j,

UVA 1363 Joseph&#39;s Problem 找规律+推导 给定n,k;求k%[1,n]的和。

/** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想法才明白. 我一开始往素数筛那种类似做法想. 想k%[1,n]的结果会有很多重复的,来想办法优化. 但没走通. 果然要往深处想. 通过观察数据发现有等差数列.直接观察很难确定具体规律:此处应该想到用式子往这个方向推导试一试. lrj想法: 设:p = k/i; 则:k%i = k-i*p; 容易想到

UVA 1363 - Joseph&#39;s Problem(数论)

UVA 1363 - Joseph's Problem 题目链接 题意:给定n, k,求出∑ni=1(k mod i) 思路:由于n和k都很大,直接暴力是行不通的,然后在纸上画了一些情况,就发现其实对于k/i相同的那些项是形成等差数列的,于是就可以把整个序列进行拆分成[k,k/2],[k/2, k/3], [k/3,k/4]...k[k/a, k/b]这样的等差数列,利用大步小步算法思想,这里a枚举到sqrt(k)就可以了,这样就还剩下[1,k/a]的序列需要去枚举,总时间复杂度为O(sqrt(

UVa 1363 (数论 数列求和) Joseph&#39;s Problem

题意: 给出n, k,求 分析: 假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p 则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p 然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n / i)],n/i的整数部分相同,于是有了这份代码. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace

UVa1363 - Joseph&#39;s Problem(数论)

在题目中有三种情况: 1.1<k<n: 2.k == n ; 3.k>n; 对于第一种情况我们可以分为1到k和k到n两个子问题来解. 1.1.1到k: for( i = 1 , sum = 0 ; i <= k ; i ++ ) sum += k %i ; 1.2.k到n: sum =(n-k)*k; 而对于第二种情况就是第一种情况的(1).但是就这样写的话时明显的tle的. 对于第二种情况也可以分为几个小问题来求解: 2.1.1到k/2: for( i = k/2 ; i >

POJ 2800 Joseph&#39;s Problem

给n 和 k 求: ∑1<=i<=n(k mod i). p  = k/i k mod i = k - p * i k mod ( i + 1 ) = k - p * ( i + 1 ) = k mod i - p k mod ( i + 2 ) = k - p * ( i + 2 ) = k mod i - 2 * p 对于连续的 i ,很多p都是一样的 . 相差的部分是一个等差数列 , i 的 范围是 从 i 到 min(k/p,n) 如果 p == 0 则 一直延续到最后 Joseph'

LA 3521 Joseph&#39;s Problem

题意:给你正整数n和k,然后计算从i到n k%i的和: 思路:如果n小于1000000,直接暴力计算,然后大于1000000的情况,然后在讨论n和k的大小,根据k%i的情况,你会发现规律,是多个等差数列,然后你把这些等差数列加上就是答案. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 using namespace std; 6 7 ll

[2016-02-19][UVA][524][Prime Ring Problem]

UVA - 524 Prime Ring Problem Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers  into each circle separately, and the

UVA 10837 - A Research Problem(欧拉函数)

UVA 10837 - A Research Problem 题目链接 题意:给定phi(n),求最小满足的最小的n 思路:phi(n)=pk11(p1?1)?pk22(p2?1)?pk33(p3?1)....(p为质数),因此对于给定phi(n),先把满足条件phi(n)%(p?1)=0的素数全找出来,在这些素数基础上进行暴力搜索,枚举哪些素数用与不用,求出最小值.这样做看似时间复杂度很高,但是实际上,由于每次多选一个素数之后对于值是呈指数上升的,所以实际组合出来的情况并不会太多,因此是可行的