UVA 1363 Joseph'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;

容易想到有可能k/i==k/(i+1)

当k/i=k/(i+1); k%(i+1) = k-(i+1)*p = k - i*p - p = k%i - p; 发现等差。

如果k/j = k/i = p; 那么[i,j]区间内的值为一个等差数列。等差为-p;

如何求最大的j呢? j = k/p; 项数n = j-i+1 = k/p - i + 1 = (k-i*p)/p + 1 = (k%i)/(k/i) + 1;

首项:a1 = k%i;
公差:d = -p = -k/i;

当d = 0;说明后面的结果全部相同等于a1;
当d > 0;按照上述推导计算.

*/

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ull getSum(ull a1,ull n,ull d)
{
    ull sum = 0;
    sum = n*a1+n*(n-1)/2*d;
    return sum;
}
int main()
{
    int n, k;
    while(scanf("%d%d",&n,&k)==2)
    {
        ull a1, m, d;
        ull ans = 0;
        for(int i = 1; i <= n; i+=m){
            a1 = k%i;
            d = -k/i;
            if(d==0){
                ans += (ull)(n-i+1)*k;
                break;
            }
            m = a1/(k/i)+1;
            m = min(m,ull(n-i+1));///k >> n的时候,不要计算多出来的结果。
            ans += getSum(a1,m,d);
        }
        printf("%llu\n",ans);

        /*ans = 0;
        for(int i = 1; i <= n; i++){
            ans += k%i;
            printf("%d\n",k%i);
        }
        printf("%llu\n",ans);
        printf("-----------\n");*/
    }
    return 0;
}

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

时间: 2024-12-25 23:26:06

UVA 1363 Joseph's Problem 找规律+推导 给定n,k;求k%[1,n]的和。的相关文章

UVa 1363 Joseph&#39;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\)的时候把它所在的等差数列之和累加到答案中, 大大降低了时间复杂度. 代

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(数论)

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 - 1646 - Edge Case(找规律)

题意:n(3 <= n <= 10000)个结点组成一个圈,求匹配(即没有公共点的边集)的个数. 找规律为斐波那契的性质,因为数太大所以用的java大数. import java.math.BigInteger; import java.util.Scanner; public class Main{ public static int MAXN = 10000 + 10; public static BigInteger []c = new BigInteger[MAXN]; public

UVa 808 (建坐标系、找规律) Bee Breeding

题意: 如图,按照图中的规律给这些格子编号.给出两个格子的编号,求从一个格子到另一个格子的最少步数.(一步只能穿过有有公共边的格子) 分析: 根据高中数学知识,选任意两个不共线的向量,就能表示平面上所有点. 像这样建立坐标系,根据图中的规律算出所有点的坐标. 推理也好,找找规律也好,不难发现 第一.三象限的点(x, y)到原点的距离为 |x| + |y| 第二.四象限的点(x, y)到原点的距离为 max{|x|, |y|} 递推点的坐标的时候也是比较注意细节的,否则很容易出错. 1 #incl

uva 10706 Number Sequence(找规律)

uva 10706 Number Sequence A single positive integer iis given. Write a program to find the digit located in the position iin the sequence of number groups S1S2-Sk. Each group Skconsists of a sequence of positive integer numbers ranging from 1 to k, w

uva 11636 Hello World!(找规律)

uva 11636 Hello World! When you first madethe computer to print the sentence "Hello World!", you felt so happy, not knowinghow complex and interesting the world of programming and algorithmwill turn out to be. Then you did not know anything abou

uva 10837 - A Research Problem(欧拉函数+暴力)

题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin,要求一个最小的n,欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p?1;如果p和q互质的话有phip?q=phip?phiq 然后根据这样的性质,n=pk11(p1?1)?pk22(p2?1)???pkii(pi?1),将所有的pi处理出来,暴力搜索维护最小值,虽然看上去复杂度非常高,但是因为对于垒乘来说,增长非常快,所以搜索范围大大被缩小了. #include <cs

uva 1323 - Vivian&#39;s Problem(梅森素数)

题目链接:uva 1323 - Vivian's Problem 题目大意:给定N个数,然后为每个数添加一个幂ei,最后N项垒乘的结果为M,要是得M的所有因子的和可以写成2x,求x的最大值,如果没有条件满足,输出NO 解题思路:若一个数可以写成若干个不同的梅森素数的乘积,那么这个数的所以因子和可以写成2x. 232?1的范围内只有8个梅森素数,所以可以用状压处理. 梅森素数即为2^i-1形式的素数 /********************** * 梅森素数,(2^k) - 1 * * 一个数若