Educational Codeforces Round 89 (Rated for Div. 2) 补题

B题

  • 题目链接
    点这里
  • 题意
    在这里插入图片描述
  • 思路
    在这里插入图片描述
    血的教训呀,特殊情况考虑不到。
    先说思路吧。就是可以根据样例直接猜出来做法。中间还有一段时间走错了路。哎,菜是原罪!
    就是先找到第一个包含x的区间,然后依次扩展。
    第一点错误:
    扩展的时候一定要可扩展。
if(a[i].x<l)
{
     res+=(l-a[i].x);
     l=a[i].x;
     m1--;
 }  
 if(a[i].y>r)
 {
        res+=(r-a[i].y);
       r=a[i].y;
  }

要这样写才正确。

if(a[i].x<l&&a[i].y>=l){
    res+=(l-a[i].x);
    l=a[i].x;
}
if(a[i].y>r&&a[i].x<=r){
    res+=(a[i].y-r);
    r=a[i].y;
}
  • 代码
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=110;
#define PII pair<int,int>
PII a[N];
#define x first
#define y second
void solve()
{
    int n,m,x1;
    cin>>n>>x1>>m;
    for(int i=1; i<=m; i++) cin>>a[i].x>>a[i].y;
    ll res=0;
    int l,r;
    int m1=m;
    for(int i=1; i<=m; i++)
    {
        if(m1==m&&a[i].x<=x1&&x1<=a[i].y)
        {
            res+=(a[i].y-a[i].x+1);
            l=a[i].x;
            r=a[i].y;
            m1--;
        }
        else if(m1==m)
            continue;
        else
        {
            if(a[i].x<l&&a[i].y>=l)
            {
                res+=(l-a[i].x);
                l=a[i].x;
            }
            if(a[i].y>r&&a[i].x<=r)
            {
                res+=(a[i].y-r);
                r=a[i].y;
            }

        }
        //cout<<res<<endl;
    }
    res=max(1*1ll,res);
    cout<<res<<endl;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
        solve();
}

C题

  • 题意
    在这里插入图片描述
  • 思路
    可以直接看代码
  • 代码
#include<bits/stdc++.h>

using namespace std;

const int N=110;
int a[N][N],sum0[N],sum1[N];
//sum0存储的是第i步上0的个数,sum1存储的是第i步上1的个数。对称步数上应该要么全是1,要么全是0;
void solve()
{
    memset(sum0,0,sizeof(sum0));//一定要记得初始化
    memset(sum1,0,sizeof(sum1));
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {
        if(a[i][j]) sum1[i+j-1]++;
        else sum0[i+j-1]++;
    }

    int res=0;
    for(int i=1;i<=(n+m-1)/2;i++)
    {
        sum0[i]+=sum0[n+m-i];
        sum1[i]+=sum1[n+m-i];
        res+=min(sum0[i],sum1[i]);
    }
    cout<<res<<endl;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
        solve();
}

D题

p 1   p 2   p 3   …   p m p_1 ~ p_2~ p_3~ … ~ p_m p1 p2 p3  pm a i a_i ai 的质因子 , d 1 = p 1 k , d 2 = a i / p 1 k d_1 = p_1^k , d_2 = a_i / p_1^k d1=p1k,d2=ai/p1k

其中 p 1 p_1 p1 a i a_i ai 的最小质因子 , a i a_i ai % p 1 k p_1^k p1k = 0 且 a i a_i ai % p 1 ( k + 1 ) ! = 0 p_1 ^ {(k + 1)} != 0 p1(k+1)!=0

那么显然 ( d 1 + d 2 ) (d_1+d_2) (d1+d2)% p 1 ≠ 0 , ( d 1 + d 2 ) p_1≠0, (d_1+d_2) p1=0,(d1+d2)% p 2 ≠ 0 , … , ( d 1 + d 2 ) p_2≠0 ,…,(d1+d2) p2=0,,(d1+d2)% p m ≠ 0 p_m≠0 pm=0

所以 a i a_i ai 的所有质因子 d 1 + d 2 d_1 + d_2 d1+d2 都不包含 , 即 d 1 + d 2 d_1 + d_2 d1+d2 a i a_i ai 互质 ( 当 d 2 d_2 d2 = 1 时答案为 -1 )

而本题数据范围很大 , 所以我们得先用线性筛找出 1 − 1 e 7 1-1e^7 11e7 内每个数的 p 1 p_1 p1 然后再操作

  • 代码
#include<bits/stdc++.h>
using namespace std;
int prime[10000100],minprime[10000100];
int euler(int n)
{
    int c = 0;
    for(int i = 2 ; i <= n ; i ++)
    {
        if(!minprime[i]) prime[++ c] = i , minprime[i] = i;
        for(int j = 1 ; j <= c && i * prime[j] <= n ; j++)
        {
            minprime[i * prime[j]] = prime[j];
            if(i % prime[j] == 0) break;
        }
    }
    return c;
}
const int N = 5e5 + 10;
int n , a[N] , ans[N][2];
signed main()
{
    ios::sync_with_stdio(false);
    euler(1e7);
    cin >> n;
    for(int i = 1 ; i <= n ; i ++) cin >> a[i];
    for(int i = 1 ; i <= n ; i ++)
    {
        int x = a[i] , now = 1 , mi = minprime[x];
        while(x % mi == 0) x /= mi , now *= mi;
        if(now != 1 && x != 1) ans[i][0] = now , ans[i][1] = x;
        else ans[i][0] = -1 , ans[i][1] = -1;
    }
    for(int j = 0 ; j <= 1 ; j ++)
    {
        for(int i = 1 ; i <= n ; i ++) cout << ans[i][j] << " ";
        cout << '\n';
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值