gay队牛逼!

我们可以强行拆一下柿子,最终得到的值会是m^k*x+m^k*u(k)*a+m^k-1*u(k-1)*a……m^0*u(0)*a

其中u表示后面有i个m的a有多少个

答案就是k+∑u

枚举每一个k,然后贪心选择u(k),那么k越大u(k)也尽可能取大,答案才会越小

其实想过拆柿子的啊,但是有些u=0我把这些位给忽略掉啦,搞得不是很会

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
inline LL write(LL x)
{
if(x>=)write(x/);
putchar(x%+'');
} LL a,b,p,q,l,r;
LL mi[]; LL now,nt,np,psd[];
LL u[];
void pro(LL k)
{
np=;
if(k==){psd[++np]=u[],nt=;return ;} if(u[]!=)
nt=,psd[++np]=u[];
else nt=;
psd[++np]=;
for(LL i=;i<k;i++)
{
if(u[i]==)psd[np]++;
else psd[++np]=u[i],psd[++np]=;
}
if(u[k]!=)psd[++np]=u[k]; reverse(psd+,psd+np+);
nt=(nt+np+)%;
}
bool calc(LL k)
{
LL x=mi[k]*p,y=mi[k]*q; now=k;
memset(u,,sizeof(u));
if(x>=l){pro(k);return true;}
for(LL i=k;i>=;i--)
{
LL d=l-x;
u[i]=d/a/mi[i];
if(x+mi[i]*u[i]*a>=l){now+=u[i];pro(k);return true;}
else if(y+mi[i]*(u[i]+)*a<=r){now+=++u[i];pro(k);return true;}
else
{
now+=u[i];
x+=mi[i]*u[i]*a;
y+=mi[i]*u[i]*a;
}
}
return false;
} LL ans,ft,tp,num[];
bool smaller()
{
if(ans==-||ans>now)return true;
else if(ans<now)return false; if(nt<ft)return true;
else if(nt>ft)return false;
for(int i=;i<=now;i++)
if(psd[i]!=num[i])return ((i+nt)%==)^(psd[i]>num[i]);
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int T_T=;
while(scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&p,&q,&l,&r)!=EOF)
{
if(a==&&b==&&p==&&q==&&l==&&r==)break;
printf("Case %d: ",++T_T);
if(l<=p&&q<=r){puts("empty");continue;} ans=-;mi[]=;
for(LL k=;mi[k]*q<=r;k++)
{
if(mi[k]*q-mi[k]*p+>r-l+)break;
if(calc(k))
{
if(smaller())
{ans=now,ft=nt,tp=np;memcpy(num,psd,sizeof(num));}
}
mi[k+]=mi[k]*b;
if(b==)break;
}
if(ans==-){puts("impossible");}
else
{
for(LL i=;i<tp;i++)
write(num[i]),putchar(((i+ft)%==)?'A':'M'),putchar(' ');
write(num[tp]),putchar(((tp+ft)%==)?'A':'M'),puts("");
}
} return ;
}

bzoj3957: [WF2011]To Add or to Multiply的更多相关文章

  1. leetcode@ [2/43] Add Two Numbers / Multiply Strings(大整数运算)

    https://leetcode.com/problems/multiply-strings/ Given two numbers represented as strings, return mul ...

  2. [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings

    这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...

  3. UVA 1101 To Add or to Multiply

    首先我们观察加操作和乘操作会对区间产生那些影响.加操作只会平移区间,而乘操作既能移动区间还能放大区间.因此我们不难想到,如果m>1的话乘操作是log级别的,一方面是因为区间的大小不能超过s-r, ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. [LeetCode] Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  6. [LeetCode] 415. Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  7. C++ 关键字浅谈

    这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...

  8. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  9. 一步一步HTML5粒子编辑器

    写在前面 大家阅读此文之前,可以先看一篇MiloYip的文章:用JavaScript玩转游戏物理(一)运动学模拟与粒子系统,看完之后再看此文,更加容易理解. MiloYip使用的粒子是canvas中绘 ...

随机推荐

  1. 【Codevs1907】方格取数3(最小割)

    题意:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. n,m<=30 思路:如果 ...

  2. hdu3491最小割转最大流+拆点

    题意:求最小割,即求最大流即可.此题之关键为拆点(限制在点),每条边都是双向边,注意一下. 未1A原因:在拆点之后添加边的过程中,要注意,出去的是i`,进来的是i,!!所以,写addegde函数时候 ...

  3. python多线程(三)

    原文:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式: ...

  4. JVM内存分为哪几部分?各个部分的作用是什么?

    JVM内存分为哪几部分?各个部分的作用是什么?   1. Java虚拟机内存的五大区域 Java的运行离不开Java虚拟机的支持,今天我就跟大家探讨一下Java虚拟机的一些基础知识. JVM内存区域分 ...

  5. (转) go Cron的使用

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  6. Maven学习在Elipse中发布一个Maven项目到Tomcat

    原文:http://www.cnblogs.com/quanyongan/archive/2013/04/26/3044618.html 对于maven初学者的我,经常遇到一个问题就是,maven项目 ...

  7. 取汉子拼音首字母的VB.Net方法

    '/ <summary> '/ 获得一个字符串的汉语拼音码 '/ </summary> '/ <param name="strText">字符串 ...

  8. BUPT复试专题—三元组(2016)

    题目描述 给你一个长度为m的数组(数组元素从0到m-1),如果数组里有a[i]+a[j]==a[k](i,j,k大于等于0并且小于m),便称之为三元组.现在给你一个数组,让你求三元组的个数. 例如m为 ...

  9. [转]Linux上程序执行的入口--Main

    main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...

  10. Linux中修改docker镜像源及安装docker

    1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.re ...