【2016杭电女生赛1009】【未完成 细节待编辑★ 挖掘本质找关系
发布时间:2021-03-16 03:04:16 所属栏目:大数据 来源:网络整理
导读:#includestdio.h#includeiostream#includestring.h#includestring#includectype.h#includemath.h#includeset#includemap#includevector#includequeue#includebitset#includealgorithm#includetime.h#includeassert.husing namespace std;void fre() { freope
#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> #include<assert.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,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef 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); assert(a >= 1 && a <= 100); assert(b >= 1 && b <= 100); 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) 【类型】 暴力 【分析】 我们直接枚举n是要GG的 设gcd(a,b)=g,b=b/g,a=a/g S(n):S(2n)==b:a,那么我们有S(n):S(2n)=b:a 我们可以枚举S(n),即直接枚举b的倍数。 然而这种做法依然比较难处理。 ========================================= 一个好的做法是,我们研究本质问题。 我们发现,如果一个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的比例关系。 然后模拟一遍即可。 */ (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |