Codeforces Round #489 (Div. 2) ABC总结

貌似是数学题专场?

一共做了三道  BC 各 WA 5次和3次 最后还都挂了终测。。。= =。

掉了30多分。。。rk 1600+

A题就是求除0以外的所有不相同的数字个数,用set写很简单。

B题给定范围[l,r],你要找出对数(a,b),使gcd(a,b)=x&&lcm(a,b)=y。(1<=l,r,a,b<=1e9)

写了个暴力+剪枝,结果活生生终测TLE on test 94  醉了!!!

看到一个比较快速的解法,枚举i (i*x=a),则i'=y/(i*x) (i'*x=b)   即(a*b==x*y)

i的范围是[1,sqrt(y/x)]。

然后时间复杂度就可以大大降低。。。再加个set去重就可以了。

留一份代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
ll n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
ll ans,ct,cnt,tmp,flag;
ll l,r,x,y;
ll gcd(ll x,ll y)
{
    while(x^=y^=x^=y%=x);
    return y;
}
int main()
{
    //cout<<gcd(15,6);
    while(scanf("%lld%lld%lld%lld",&l,&r,&x,&y)!=EOF)
    {
        set<pair<ll,ll> >p;
        ans=0;   flag=1;
        if(y%x) {puts("0");continue;}
        tmp=y/x;
        for(ll i=1;i<=sqrt(tmp);i++){
            if(tmp%i==0)
            {
                ll a=i*x,b=(tmp/i)*x;
                if(a>=l&&a<=r&&b>=l&&b<=r&&gcd(i,tmp/i)==1)
                {
                    p.insert(make_pair(a,b));
                    p.insert(make_pair(b,a));
                }
            }
        }
        printf("%d\n",p.size());
      //  if(flag) puts("Yes"); else puts("No");
    }
    return 0;
}

C题就是找规律,题意不说了,分两种情况

1、if x=0  答案为0  必须特判!!!

2、if y=0  答案为(2*x)%mo

3、else 答案为 ((2*x+-1+mo)%mo*power(2,y-1))%mo;

注: 一定不要先把x取mod 否则 x=1e9+7的时候就会WA!!!

留一份代码:

#include<bits/stdc++.h>
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
const ll mo=1e9+7;
ll n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
ll ans,ct,cnt,tmp,flag;
ll l,r,x,y;
ll power(ll a,ll n)   //a的n次方mod
{
    ll ans=1;
    a=a%mo;
    while (n)
    {
        if(n&1) ans=(ans*a)%mo;
        n>>=1;
        a=(a*a)%mo;
        }
    return ans;
}
ll min(ll a,ll b){if(a<b) return a;return b;}
ll max(ll a,ll b){if(a<b) return b;return a;}
int main()
{
    while(cin>>x>>y)
    {
        if(y==0) cout<<(2*(x%mo))%mo<<endl;
        else if(x==0) cout<<x<<endl;
        else {
        tmp=(2*x-1)%mo;
        tmp=(tmp*power(2,y-1))%mo;
        tmp=(2*tmp)%mo+1;
        cout<<tmp%mo<<endl;}
      //  if(flag) puts("Yes"); else puts("No");
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值