HDU 5970 最大公约数

中文题

题意:

思路:

1、观察可得 模m的同余系和m的gcd都相同(这题多了一个c也是相同的)

2、由于取证所以不能用简单的用O(m^2)的做法,涉及到多1少1的

3、打表观察,例如i为模9为7的数 j为9

则i*j/f(i,j) 有这样的规律:

括号内为相邻值的差,而这个差是有循环节的,也就意味着,这可以看作4个等差数列。

又发现f(i,j)的c为4。

然后就大胆猜测c就是循环节。又试了几个数,果然是这样。

//不过很巧的是,循环节有一点小规律,但是没有仔细想,说不定可以有O(m^2)的做法

然后gcd的计算次数是log级别的,所以总的复杂度就是O(T*m^2*log(m))

//不过我的程序跑得不是很快。几乎是卡时间过的

具体细节看代码:

 1 LL f(int x, int y, int& g, int& c)
 2 {
 3     c = 0;
 4     int t;
 5     while (y)
 6     {
 7         c++;
 8         t = x % y;
 9         x = y;
10         y = t;
11     }
12     g = x;
13     return x * x * c;
14 }
15
16 int n, m, p;
17 void init()
18 {
19     get_int(n);
20     get_int(m);
21     get_int(p);
22 }
23
24 void solve()
25 {
26     int ans = 0, g, c;
27     for (int j = 1; j <= m; j++)
28     {
29         for (int i = 1; i <= j && i <= n; i++)
30         {
31             LL ff = f(i, j, g, c);
32             for (int k = 0; k < c; k++)
33             {
34                 if (i + k * j > n) break;
35                 LL a0 = (i + k * j) * j / ff;
36                 LL d = c * j * j / ff;
37                 LL num = (n - (i + k * j)) / (c * j) + 1;
38                 ans = ((ans + a0 * num) % p + num * (num - 1) / 2 % p * d % p) % p;
39             }
40         }
41     }
42     printf("%d\n", ans);
43 }
44
45 int main()
46 {
47     int T;
48     get_int(T);
49     while (T--)
50     {
51         init();
52         solve();
53     }
54     return 0;
55 }
时间: 2024-08-02 23:03:52

HDU 5970 最大公约数的相关文章

求等差数列除以C下取整求和

先来大宝贝 a 公差 b 初始项 c 除数 n 项数 long long get(long long a,long long b,long long c,long long n){ if (n<=0) return 0; if (n==1) return (b/c) % mod; long long tmp = 0; tmp += (a/c)%mod*((n-1)*n/2%mod)%mod; tmp %= mod; tmp += (b/c)*(n)%mod; tmp %= mod; a = a%

HDU 2504 又见GCD(最大公约数与最小公倍数变形题)

又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18480    Accepted Submission(s): 7708 Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n

HDU 5050 Divided Land(最大公约数Java)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5050 Problem Description It's time to fight the local despots and redistribute the land. There is a rectangular piece of land granted from the government, whose length and width are both in binary form.

HDOJ(HDU) 2503 a/b + c/d(最大公约数问题)

Problem Description 给你2个分数,求他们的和,并要求和为最简形式. Input 输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整数a,b,c,d(0 import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc= new Scanner(System.in); int t =sc.nextInt()

(hdu 2.1.4)又见GCD(求最大公约数GCD的变化题)

题目: 又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2685 Accepted Submission(s): 1327   Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n,

HDU 1713 最小公倍数与最大公约数的问题 相遇周期

欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) 相遇周期 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2465    Accepted Submission(s): 1236 Problem Description 2007年3月26日,在中俄两国元首的见证下,中国国家航天局局长孙来燕与俄罗斯联邦航天局局长别尔米诺夫

HDU 2503 (数论,最大公约数)

a/b + c/d Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14895    Accepted Submission(s): 7761 Problem Description 给你2个分数,求他们的和,并要求和为最简形式. Input 输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整

(hdu step 2.1.1)最小公倍数(使用最大公约数来辅助求最小公倍数)

题目: 最小公倍数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3609 Accepted Submission(s): 2596   Problem Description 给定两个正整数,计算这两个数的最小公倍数. Input 输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数. Output 对于每个测试用例,给出这

2015 HDU 多校联赛 5317 RGCDQ 筛法求解

2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据量大, 所以必须做预处理.也就是用筛法求出全部的F[x],将全部F[x] 打印出来发现.事实上结果不大,最大的数值是7.所以对于每一个区间询问, 直接暴力求取有多少个 1 2 3 4 5 6 7 就可以,从大到小查找.假设出现2个以上 3-7 的数值,那么最大公约数就是该数字. 假设没有出现两个反复