SGU - 444 Headstrong Student 模拟+循环节
2017-11-27 20:07
337 查看
题意:
求 a / b 的小数点后的循环节的开始点和循环节长度
至于整数,循环节长度为0,开始位置就是整除完了的后一位
思路:
直接模拟,出现重复的余数,说明出现了循环节,如果被整除了的话直接输出
本来看错数据大小了,用的 map 记录余数的位置,748ms 卡过,后来发现只有1e6 的数据,用数组记录就好了;
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define kuaidian ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 7, maxd = 670000 + 7;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int x, y;
int vis[maxn] = {0};
void solve() {
int cnt = 1, a, b;
x %= y;
while(1) {
if(x % y == 0) {
printf("%d 0\n", cnt-1);
return;
}
else if(x < y) {
int t = x % y;
if(vis[t] > 0) {
a = vis[t];
b = cnt - vis[t];
printf("%d %d\n", a-1, b);
return;
}
else {
vis[t] = cnt++;
}
x *= 10;
}
else {
x %= y;
}
}
}
int main() {
kuaidian;
cin >> x >> y;
solve();
return 0 ;
}
求 a / b 的小数点后的循环节的开始点和循环节长度
至于整数,循环节长度为0,开始位置就是整除完了的后一位
思路:
直接模拟,出现重复的余数,说明出现了循环节,如果被整除了的话直接输出
本来看错数据大小了,用的 map 记录余数的位置,748ms 卡过,后来发现只有1e6 的数据,用数组记录就好了;
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define kuaidian ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 7, maxd = 670000 + 7;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int x, y;
int vis[maxn] = {0};
void solve() {
int cnt = 1, a, b;
x %= y;
while(1) {
if(x % y == 0) {
printf("%d 0\n", cnt-1);
return;
}
else if(x < y) {
int t = x % y;
if(vis[t] > 0) {
a = vis[t];
b = cnt - vis[t];
printf("%d %d\n", a-1, b);
return;
}
else {
vis[t] = cnt++;
}
x *= 10;
}
else {
x %= y;
}
}
}
int main() {
kuaidian;
cin >> x >> y;
solve();
return 0 ;
}
相关文章推荐
- ACM 数论 SGU 444 Headstrong Student
- SGU 242 Student's Morning 网络流(水
- SGU 191.Exhibition(模拟)
- SGU 271Book Pile(模拟 deque+stack)
- 计蒜客 斐波那契数列 循环节 模拟
- sgu242:Student's Morning(网络流)
- 51nod 1035 最长的循环节【模拟除法】
- SGU 476 Coach's Trouble 大数模拟
- Thunderhead Engineering PyroSim 2015.2.0604 Win64 1CD火灾消防动态模拟
- sgu——340(字符串模拟)
- SGU 257 Debt 贪心 + 模拟
- CS R22 C(dfs暴力),D(字符串循环节,模拟),E(贪心+线段树维护)
- SGU 271 双端队列 和 栈 模拟
- BOOST_PP_CAT / BOOST_PP_SEQ_CAT / BOOST_PP_SEQ_SIZE / BOOST_PP_SEQ_HEAD / BOOST_PP_LESS_EQUAL 等 模拟编译器的推导过程
- PAT 1039 Course List for Student (模拟)
- Head First C# (蜂巢模拟系统)
- 【SGU】271. Book Pile(双端队列模拟)
- sgu-242 Student's Morning
- 快速切题 sgu115. Calendar 模拟 难度:0
- SGU181_X-Sequence(暴力寻找循环节)