【2016杭电女生赛1009】【挖掘本质找关系 模拟】sum 找到最小的正整数,满足a乘sum(n)==b乘S(2n)

来源:互联网 发布:php留言板视频教程 编辑:程序博客网 时间:2024/05/01 03:42
#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<ctype.h>#include<math.h>#include<set>#include<map>#include<vector>#include<queue>#include<bitset>#include<algorithm>#include<time.h>using namespace std;void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define MP(x,y) make_pair(x,y)#define ls o<<1#define rs o<<1|1typedef long long LL;typedef unsigned long long UL;typedef unsigned int UI;template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }const int N = 1010, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;int casenum, casei;int a, b;int gcd(int x, int y){return y == 0 ? x : gcd(y, x%y);}void gcdit(int &x, int &y){int g = gcd(x, y);x /= g; y /= g;}char s[N];void solve(int sum, int len){if (len * 5 > sum) { puts("0"); return; }gcdit(sum, len);MS(s, 0);sum -= len * 5;for (int i = 0; i < len; ++i)s[i] = '5';for (int i = 0; i < len; ++i){int plus = min(sum, 4);sum -= plus;s[i] += plus;}while (sum >= 4)s[len++] = '4', sum -= 4;if (sum)s[len++] = '0' + sum;reverse(s, s + len);puts(s);}int main(){scanf("%d", &casenum);for (casei = 1; casei <= casenum; ++casei){scanf("%d%d", &a, &b); if (a == 2 * b) { puts("1"); continue; }if (a > 2 * b) { puts("0"); continue; }gcdit(a, b);int sum = 9 * b;int len = 2 * b - a;solve(9 * b, 2 * b - a);}return 0;}/*【题意】我们要找出最小的正整数n满足——a*S(n)==b*S(2n)a,b的范围都在[1,100]【类型】暴力【分析】这道题目的结果可能非常大,所以我们直接枚举n是要GG的。首先可以有这样的基础性结论:设gcd(a,b)=g, 我们可以先使得b=b/g, a=a/gS(n):S(2n)==b:a,那么我们有S(n):S(2n)=b:a。然后,一个好的做法是,我们研究本质问题。我们发现,如果一个digit是0~4,那么*2的效益是完全获得的。如果一个digit的是5~9,那么*2后会损失9的收益。a*S(n) == b*S(2n),我们假设有l的长度是[0,4]范围,有L的长度是[5,9]范围那么显然满足:S(2n)=S(n)*2-L*9替换一下——a*S(n) == b*(2S(n)-L*9)a*S(n) == 2b*S(n) -L*9*b(2b-a)*S(n) == L*9*b即——9*b:2b-a = S(n):L也就是说,我们得到了S(n)与L的比例关系。然后模拟一遍即可。怎么模拟呢?我们不妨假设答案n仅有长度为L,且每一位都是5然后得到了把数位和sum分撒出去。对于sum余下的数值,我们依次加到尾巴上。如果sum最后把长度为L的字串都填充为'9'之后,还有剩余,那么在前面贪心填充。*/

0 0