鱼C论坛

 找回密码
 立即注册
查看: 1712|回复: 14

[已解决]python分数

[复制链接]
发表于 2020-8-9 15:59:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分数
共 5 个测试点  每个测试点 20 分

每个测试点限时 3 秒  运行内存上限 512MB

查看本题最近一次测评结果

一个序列有 nn 个数,编号 1\dots n1…n ,最初第 ii 个数是 \frac 1 i
i
1
​       
(i\in[1,n]i∈[1,n])。每次选取编号最小且分母不为 11 的分数,设这个分数为 \frac p q
q
p
​       
  ,令所有分数都乘上 qq 并化简,重复这个过程直到所有数分母均为 11 。

你需要按顺序求出每次操作乘上的数 qq 。

为了减少输出量,采用如下输出方式:给定两个整数 a,ba,b ,对于每次操作的 qq ,执行 a=a\times q+ba=a×q+b ,最后输出 aa 对 2^{32}2
32
  取模的值。

输入格式
一行三个正整数 n, a, bn,a,b 。

输出格式
一行一个整数,表示答案。

数据范围与约定
对于 20\%20% 的数据,保证 n\leq 7n≤7 。

对于 40\%40% 的数据,保证 n\leq 5000n≤5000 。

对于 60\%60% 的数据,保证 n\leq 50000n≤50000 。

对于 100\%100% 的数据, 0< n\leq 8\times 10^70<n≤8×10
7
  , 0< a,b< 2^{32}0<a,b<2
32
  。

样例输入
4 2 3
样例输出
51
样例解释
初始 a=2,b=3a=2,b=3 ,序列为:

1\quad\frac 1 2\quad\frac 1 3\quad\frac 1 4
1
2
1
&#8203;       
  
3
1
&#8203;       
  
4
1
&#8203;       

第一次操作 q=2q=2 ,执行 a=a\times q+ba=a×q+b 后 a=7a=7 ,序列变为:

2\quad 1\quad\frac 2 3\quad\frac 1 2
21
3
2
&#8203;       
  
2
1
&#8203;       

第二次操作 q=3q=3 ,执行 a=a\times q+ba=a×q+b 后 a=24a=24 ,序列变为:

6\quad 3\quad 2\quad\frac 3 2
632
2
3
&#8203;       

第三次操作 q=2q=2 ,执行 a=a\times q+ba=a×q+b 后 a=51a=51 ,序列变为:

12\quad 6\quad 4\quad 3
12643
此时所有数分母均为 11 ,过程结束。
最佳答案
2020-8-10 11:08:33
陈尚涵 发表于 2020-8-10 10:48
这个用Java写效率会更快
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdint.h>



  4. uint64_t gcd(uint64_t a, uint64_t b) {
  5.     uint64_t c;

  6.     while (b) {
  7.         c = a % b;
  8.         a = b;
  9.         b = c;
  10.     }

  11.     return a;
  12. }



  13. int main() {
  14.     uint32_t n, a, b, num, temp;
  15.     uint64_t product = 1;

  16.     scanf("%u%u%u", &n, &a, &b);


  17.     for (num = 1; num <= n; num++) {
  18.         if (product % num) {
  19.             temp = num / gcd(num, product);
  20.             product *= temp;
  21.             a *= temp;
  22.             a += b;
  23.         }
  24.     }


  25.     printf("%u", a);
  26.     return 0;
  27. }
复制代码
2020-08-09 (7).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 15:59:29 | 显示全部楼层
这是……??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 16:29:23 | 显示全部楼层
兄弟,我看你题目看得好苦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 16:38:04 | 显示全部楼层
题目原题
2020-08-09 (9).png
2020-08-09 (7).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 17:15:18 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-9 17:17:04 | 显示全部楼层
但是确实超时了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 17:18:36 | 显示全部楼层
zzzyf 发表于 2020-8-9 17:17
但是确实超时了


麻烦回复啊不然我看不到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 17:19:12 | 显示全部楼层
zzzyf 发表于 2020-8-9 17:17
但是确实超时了

我能用 C 语言写吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 17:20:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 20:03:05 | 显示全部楼层

试试这个:
  1. from math import gcd

  2. n, a, b = map(int, input().split())
  3. num = product = 1


  4. while num <= n:
  5.     if product % num:
  6.         temp = num // gcd(num, product)
  7.         product *= temp
  8.         a = (a * temp + b) % 4294967296

  9.     num += 1


  10. print(a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 10:48:00 | 显示全部楼层

这个用Java写效率会更快
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-8-10 10:49:40 | 显示全部楼层
陈尚涵 发表于 2020-8-10 10:48
这个用Java写效率会更快

用 C 更快。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 11:08:33 | 显示全部楼层    本楼为最佳答案   
陈尚涵 发表于 2020-8-10 10:48
这个用Java写效率会更快
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdint.h>



  4. uint64_t gcd(uint64_t a, uint64_t b) {
  5.     uint64_t c;

  6.     while (b) {
  7.         c = a % b;
  8.         a = b;
  9.         b = c;
  10.     }

  11.     return a;
  12. }



  13. int main() {
  14.     uint32_t n, a, b, num, temp;
  15.     uint64_t product = 1;

  16.     scanf("%u%u%u", &n, &a, &b);


  17.     for (num = 1; num <= n; num++) {
  18.         if (product % num) {
  19.             temp = num / gcd(num, product);
  20.             product *= temp;
  21.             a *= temp;
  22.             a += b;
  23.         }
  24.     }


  25.     printf("%u", a);
  26.     return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 14:50:01 | 显示全部楼层
谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表