Codeforces Round #483 (Div. 2)

Link

A.B

按题意模拟即可


C

题意

给出分数p/q,问p/q在b进制下是否为无限循环小数(p,q,b<=10^18)

分析

考虑进制转化过程,若1/q在b进制下为有限小数,则p/q也一定是,那么考虑小数的进制转化,不断的×b,去掉整数,取小数部分继续×b,直至小数部分为0,即(b^k%q)==0,那么b^k的质因子和b完全相同,即b必须有q的全部因子才是有限小数,故不断q/gcd(q,b)直至q为1即可

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int t;
ll p,q,b;

ll gcd(ll a, ll b){
     return b==0?a:gcd(b,a%b);
}
int main()
{

    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&p,&q,&b);
        ll ans=gcd(p,q);
        q=q/ans,p=p/ans;
        if(p%q==0)
            printf("Finite
");
        else{
            while(q!=1&&b!=1)
            {
                b=gcd(b,q);
                q/=b;
            }
            if(q==1)printf("Finite
");
            else printf("Infinite
");
        }
    }
    return 0;
}

D    solved

题意

定义,给一个长度为n的数组a,a的一个子区间[l,r],f[l,r]定义为对该子区间执行f操作的值。定义ans[l,r]为满足l<=i<=j<=r的f[i,j]的最大值,q询问区间 ans[l,r] 的最大值    (n<=5000,q<=1e5,a[i]<=2^30-1)

分析

不难看出,f[i][j] = f[i][j-1] ^ f[i+1][j],ans[i][j]=max(ans[i][j],max(ans[i+1][j],ans[i][j-1])),区间dp思想,枚举区间长度递推过去即可

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=5000+7;

int n,q,l,r,dp[maxn][maxn],f[maxn][maxn],a[maxn];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        dp[i][i]=f[i][i]=a[i];
    }
    for(int len=2;len<=n;len++){
        for(int j=1;j+len-1<=n;j++){
            f[j][j+len-1]=f[j+1][j+len-1]^f[j][j+len-2];
        }
    }
    for(int len=2;len<=n;len++){
        for(int j=1;j+len-1<=n;j++)
            dp[j][j+len-1]=max(f[j][j+len-1],max(dp[j][j+len-2],dp[j+1][j+len-1]));
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d%d",&l,&r);
        printf("%d
",dp[l][r]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Deadline/p/9043897.html