uva 11256 - Repetitive Multiple(gcd+暴力)
来源:互联网 发布:php 加一个月 编辑:程序博客网 时间:2024/06/06 02:30
题目链接:uva 11256 - Repetitive Multiple
题目大意:给定一个数n,要求找到最小的k,使得k∗n为题目中定义的重复数字.
解题思路:枚举k∗n的循环节长度,比如当前枚举为2,那么一次判断u=1001,1001001,1001001001 ...,取d = gcd(n,u), 那么k = u / d, a = n / d (因为n∗k=u∗a)并且保证a的长度为2,所以k和a要同时扩大相应倍数。枚举过程中为何k。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const ll INF = 1e18+1;ll N, ten[20];void init () { ten[0] = 1; for (int i = 1; i < 20; i++) ten[i] = ten[i-1] * 10;}inline ll gcd (ll a, ll b) { return b == 0 ? a : gcd(b, a%b);}inline int tenbit (ll n) { int cnt = 0; while (n) { n /= 10; cnt++; } return cnt;}ll solve () { ll ans = INF; int bit = tenbit(N); if (bit == 1) return 11L; for (int i = 1; i <= bit; i++) { ll u = ten[i] + 1; while (true) { ll d = gcd(N, u); ll a = N / d; ll k = u / d; if (a < ten[i]) { if (a < ten[i-1]) a = ten[i-1] / a + (ten[i-1] % a ? 1 : 0); else a = 1; if (a * k < ans) ans = k * a; } if (INF / u < ten[i]) break; u = u * ten[i] + 1; } } return ans;}int main () { init(); int cas; scanf("%d", &cas); while (cas--) { scanf("%lld", &N); while (N >= 1e9); printf("%lld\n", solve() * N); } return 0;}
1 0
- uva 11256 - Repetitive Multiple(gcd+暴力)
- UVa 11256 Repetitive Multiple
- UVA 11256 - Repetitive Multiple(数论)
- UVA11256 Problem D - Repetitive Multiple 循环节
- UVA 1642 Magical GCD 暴力+簡單數論
- UVa 11388 GCD LCM (暴力)
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
- 暴力算gcd
- GCD XOR 暴力
- gcd 暴力枚举
- hdoj Least Common Multiple【gcd】
- UVA 11827 Maximum GCD gcd
- HDU 5726 GCD(枚举暴力)
- UVA 185(暴力DFS)
- uva 654 - Ratio(暴力)
- uva 225 - Golygons(暴力)
- uva 11520 暴力
- uva 1509 - Leet(暴力)
- POJ 2136 Vertical Histogram 打印特殊图形
- 正确理解ThreadLocal
- 折腾Cubieboard
- jdk和jre的区别
- SPOJ GSS3 线段树
- uva 11256 - Repetitive Multiple(gcd+暴力)
- Android permission 访问权限大全
- cocos2d-x 3.1.1 学习笔记(二) 基本动作、动画详解
- python类库31[DOM+SAX解析XML和HTML]
- Eclipse中设置作者日期等信息
- 关于用户批量操作checkbox选项的若干实际问题解决
- Codeforces Round #246 (Div. 2) A,B,C,D
- 思科网络技术学院教程实验——拓扑布局和建立小型网络
- hdu 3068 最长回文