The Golden Age CodeForces - 813B (数学+枚举)

Unlucky year in Berland is such a year that its number n can be represented as n = xa + yb, where a and b are non-negative integer numbers.

For example, if x = 2 and y = 3 then the years 4 and 17 are unlucky (4 = 20 + 31, 17 = 23 + 32 = 24 + 30) and year 18 isn‘t unlucky as there is no such representation for it.

Such interval of years that there are no unlucky years in it is called The Golden Age.

You should write a program which will find maximum length of The Golden Age which starts no earlier than the year l and ends no later than the year r. If all years in the interval [l, r] are unlucky then the answer is 0.

Input

The first line contains four integer numbers xyl and r (2 ≤ x, y ≤ 1018, 1 ≤ l ≤ r ≤ 1018).

Output

Print the maximum length of The Golden Age within the interval [l, r].

If all years in the interval [l, r] are unlucky then print 0.

Examples

Input

2 3 1 10

Output

1

Input

3 5 10 22

Output

8

Input

2 3 3 5

Output

0

Note

In the first example the unlucky years are 2, 3, 4, 5, 7, 9 and 10. So maximum length of The Golden Age is achived in the intervals [1, 1], [6, 6] and [8, 8].

In the second example the longest Golden Age is the interval [15, 22].

思路:直接枚举a和b的值,因为2^60大于1E18,所以可以0~61的任意枚举。

把可以得出的数字加入到一个set中,最后从头到尾遍历找最大的区间。

注意:由于数字很大,稍微大一点就爆了longlong 所以判断是否大于R的时候,用自带函数pow,因为float/double的范围很大,比LL大多了,所以不会炸精度,可以剔除掉过大的数据,

而加入到set的时候用快速幂来算那个数值,因为浮点数有精度误差。还读到了大佬的博客是把除法改成乘法来防止爆longlong,受益匪浅。

推荐一个:https://blog.csdn.net/qq_37129433/article/details/81667733

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), ‘\0‘, sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef  long long ll;
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll x,y,l,r;
vector<ll> vc;
set<ll> v;
ll quick_pow(ll a,ll b)
{
    ll ans=1;
        while(b)
        {
                if(b&1) ans= ( ans * a);
                a=( a* a);
                b>>=1;
        }
        return ans;
}
int main()
{
    gbtb;
    cin>>x>>y>>l>>r;
    for(ll i=0ll;i<=63ll;i++)
    {
        if(pow(x,i)>r||pow(x,i)<=0)
        {
            break;
        }
        for(ll j=0ll;j<=63ll;j++)
        {
            long long k=1ll*quick_pow(x,i)+1ll*quick_pow(y,j);
//            if(quick_pow(x,i)>r||quick_pow(x,i)<=0)
//            {
//                break;
//            }
            if(pow(y,j)>r||pow(y,j)<=0)
            {
                break;
            }
            if(k<=0||k>r)
            {
                break;
            }else
            {
                if(k>=l&&k<=r)
                {
                    v.insert(k);
                }
            }
        }
    }
    set<ll> ::iterator it=v.begin();
    ll ans=0ll;
    ll last=l-1;
    ll now;
    while(it!=v.end())
    {
//        cout<<*it<<" ";
         now=*it;
        if(now-last-1>ans)
        {
            ans=now-last-1;
        }
        last=now;
        it++;
    }
    r-now;
    now=r+1;
    if(now-last-1>ans)
    {
        ans=now-last-1;
    }
    cout<<ans<<endl;
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ‘ ‘ || ch == ‘\n‘);
    if (ch == ‘-‘) {
        *p = -(getchar() - ‘0‘);
        while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) {
            *p = *p * 10 - ch + ‘0‘;
        }
    }
    else {
        *p = ch - ‘0‘;
        while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) {
            *p = *p * 10 + ch - ‘0‘;
        }
    }
}

原文地址:https://www.cnblogs.com/qieqiemin/p/10257353.html

时间: 2024-10-11 20:28:04

The Golden Age CodeForces - 813B (数学+枚举)的相关文章

2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)

题目链接:http://pat.zju.edu.cn/contests/ds/2-08 一副扑克牌的每张牌表示一个数(J.Q.K分别表示11.12.13,两个司令都表示6).任取4张牌,即得到4个1~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式.每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取.运算遵从一定优先级别,可加括号控制,最终使运算结果为24.请输出一种解决方案的表达式,用括号表示运算优先.如果没有一种解决方案,则输出-1

CodeForces 776E 数学规律,欧拉

CodeForces 776E 题意:定义f(n)为(x,y)的对数,x和y要满足 x>0, y>0, x+y=n, x与y互质. 定义g(n)为f(x1)+f(x2)+......+f(xk),xi为n的因子. 再定义Fk(n)为     给定n和k,求Fk(n). tags: 好假的题..推理或者找规律,f(n)=phi(n), g(n)=n... #include<bits/stdc++.h> using namespace std; #pragma comment(link

Codeforces 300E(数学)

题意:给定k个数字,求最小的正整数n,使得“n的阶乘”是“这k个数字的阶乘的积”的倍数.1<=k<=1e6,数字ai满足1<=ai<=1e7 分析:如果我们能对着k个数字的阶乘的结果分解质因数,那么就可以根据每个质因数的指数来二分最后的答案 问题的关键就是如何分解a1!a2!a3!a4!..... 先可以预处理出1..MAX每个数在式子中出现了多少次(对于ai,也就是1~ai中间所有数字出现次数+1),这可以用差分做 我们知道了cnt[1..MAX]后,接下来就是考虑分解了 我们从

ACM学习历程——HDU4814 Golden Radio Base(数学递推) (12年成都区域赛)

Description Golden ratio base (GRB) is a non-integer positional numeral system that uses the golden ratio (the irrational number (1+√5)/2 ≍ 1.61803399 symbolized by the Greek letter φ) as its base. It is sometimes referred to as base-φ, golden mean b

bzoj 1257: [CQOI2007]余数之和sum 数学 &amp;&amp; 枚举

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Status] Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3

CodeForces 484B 数学 Maximum Value

很有趣的一道题,题解戳这. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 200000 + 10; 8 const int maxm = 1000000 + 10; 9 10 int a[maxn], f[maxm]; 11 12 int main

codeforces 711E 数学

计算1-(2^n-1)*...*(2^n-(k-1))/(2^n(k-1)). 先算公约数,可以看出公约数只能是2的n次幂,求每个分子和2的n次幂的最大公约数,因为gcd(a,b)=gcd(b-a,a),所以直接求2^n和(k-1)!的公约数,然后同除就行.这里有勒让德定理:在正数n!的素因子标准分解式中,素数p的指数记作,则.然后就能算出有多少2的约数,一除就行. 最后如果是大于最多的天数,就直接输出1.

CodeForces 454C——数学——Little Pony and Expected Maximum

Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she kept losing. Having returned to the castle, Twilight Sparkle became interested in the dice that were used in the game. The dice has m faces: the firs

Codeforces 1114E(数学+随机算法)

题面 传送门 分析 通过二分答案,我们显然可以求出数组中最大的数,即等差数列的末项 接着随机取一些数组中的数,对他们两两做差,把得到的差取gcd即为公差 例a={1,5,9,13},我们随机取了1 9 13,两两的差为8,4,12,取gcd为4 已知末项和公差即可求出首项 可以证明错误的概率< \(1.86185\times10?^{-9}\) 具体证明我也不懂,可以看cf官方题解,需要用到莫比乌斯反演 注意生成随机数时不能直接用rand(),因为rand()的返回值<32768,而n很可能&