USACO training 2.4.5 Fractions to Decimals题解

嗯...用到一个定理,对于一个最简分数n/d,d=(2^x)*(5^y)*m,m≠1,那么其循环节长度为使10^L mod m==1的最小的L,不循环长度为max(x,y)

然后这题就没什么了。。

76个字符一换行比较坑,我用了stringstream...

 1 #include<iostream>
 2 #include<sstream>
 3 #include<cstdio>
 4 #include<iomanip>
 5 #include<algorithm>
 6 #include<string>
 7 using namespace std;
 8 typedef long long LL;
 9 string s;
10 int pow_mod(int a,int b,int mod)
11 {
12     LL base=a,ans=1;
13     while(b)
14     {
15         if(b&1) ans=ans*base%mod;
16         base=base*base%mod;
17         b>>=1;
18     }
19     return (int)ans;
20 }
21 int gcd(int a,int b)
22 {
23     return b==0?a:gcd(b,a%b);
24 }
25 int x,y,m,n,d;    // n/d d=2^x * 5^y * m
26 int main()
27 {
28     freopen("fracdec.in","r",stdin);
29     freopen("fracdec.out","w",stdout);
30     stringstream ss;
31     cin>>n>>d;
32     int g=gcd(n,d);
33     n/=g;d/=g;
34     m=d;
35     while(m>1 && (m&1)==0) m>>=1,++x;
36     while(m>1 && (m%5)==0) m/=5,++y;
37     if(m==1)
38     {
39         if(n%d==0) ss<<n/d<<".0";
40         else ss<<setprecision(max(x,y))<<setiosflags(ios::fixed)<<(double)n/(double)d;
41     }
42     else
43     {
44         int i;
45         for(i=1;;++i) if(pow_mod(10,i,m)==1) break;
46         //printf("%d\n",i);
47         ss<<n/d<<‘.‘;
48         n%=d;
49         for(int j=0;j<max(x,y)+i;++j)
50         {
51             if(j==max(x,y)) ss<<‘(‘;
52             n*=10;
53             ss<<n/d;
54             n%=d;
55         }
56         ss<<‘)‘;
57     }
58     ss>>s;
59     int sz=s.length();
60     for(int i=0;i<sz;++i)
61     {
62         if(i%76==0 && i!=0) putchar(10);
63         putchar(s[i]);
64     }
65     putchar(10);
66     return 0;
67 }

时间: 2024-12-29 11:49:59

USACO training 2.4.5 Fractions to Decimals题解的相关文章

USACO Training完结感想

USACO Training在历经几年时间后终于被我刷完了.其实我很早就已经刷完了,只不过一直拖到今天才发完blog.真是怠惰呢~~~~~ USACO绝对是我成长的记录者,它看着我,从当初初出茅庐的小子一步步走到今天.虽然不能说是什么大犇,但是也是有一定实力的选手. USACO一共有6章.从简易到困难,从整体上来说这个题库不算难.是一个适合新手锻炼的地方.当然里面也有很多比较经典的题目. 它一直陪伴着我的成长,正如一只COW一样哺育了我. 如果完成前3章已经可以在NOIP中得到不错的成绩了,但是

USACO Training Section 3.1 Contact

P2724 联系 Contact 题目背景 奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣.最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来.他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的 题目描述 帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相.他们在寻找长度在A到B之间(包含A和B本身)在每天的数据文件中重复得最多的比特序列 (1 <= A <= B <= 12).他们在找那些重复得最多的比特序列.一个输入限制告诉你应输出

usaco Fractions to Decimals

分数转小数,循环小数的循环节要放在括号内 方法是模拟触发操作,然后记录下余数,每次生成的余数检查以前是否出现过,出现过说明出现了循环节,则找到循环节开始的地方. 这题一点都不好写,我反正是打了好多补丁的感觉. /* ID: modengd1 PROG: fracdec LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <vector> #inclu

LuoGu 1200 你的飞碟在这儿 &amp;&amp; USACO Training Section 1.1_1

描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用 一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给 这些彗星取的名字呢?).关于如何搭配的细节会在下面告诉你:你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带 走. 小组名和彗星名都以下列方式转换成一个数字:最终的数字

USACO Section 2.1 Ordered Fractions

/* ID: lucien23 PROG: frac1 LANG: C++ */ #include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; typedef struct Fraction { int numerator; int denominator; Fraction(){} Fraction(int x, int

USACO Training Section3.1 Score Inflation

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数.你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大.输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000.后面的每一行将包括两个整数来描述一个"种类": 第一个

【USACO 2.1】Ordered Fractions

/* TASK: frac1 LANG: C++ URL: http://train.usaco.org/usacoprob2?S=frac1&a=dbgwn5v2WLr SOLVE: 直接枚举,约分,排序,去重 */ #include<cstdio> #include<algorithm> using namespace std; struct node{ int nu,deno; double v; }a[40000]; int n,cnt; int cmp(node

LuoGu 1201 贪婪的送礼者 &amp;&amp; USACO Training Section 1.1_2

描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱. 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目. 格式 PROGRAM NAME: gift1 INPUT FORMAT: (f

LuoGu 1202 黑色星期五 &amp;&amp; USACO Training Section 1.1_3

描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400. 注意,开始今年是一千九百年,不是1990 这里有一些你要知道的: 1.1900年1月1日是星期一. 2.4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天. 3.年份可以被4整除的为闰年(