【智算之道】2020智算之道复赛题解

发挥不好的一场

只包含ABCD ,E 过两日会update!

A.数字

签到题吧,枚举前三位即可

Code:

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,p;
int main()
{
    read(n);read(m);
    int ans = 0;
    ll x = 1;
    while(x<=n) x*=10;
    for(register int i=100;i<=999;i++){
        ll temp = (i*x+n);
        if((temp/m)*m == temp) ans++;
    }
    printf("%d\n",ans);
    return 0;
}
/***
***/

B.网格

贪心的考虑一下

如果平常走费用少,绝对会平常走

否则尽可能多的去走魔法方格

多的魔法方格就走一个xy都哦严格递增的最长上升子序列

Code:

ll n,m,p;
struct node{
    ll x,y;
}q[maxn];
bool operator<(node a,node b){
    if(a.x == b.x) return a.y < b.y;
    return a.x < b.x;
}
int st[maxn];
int main()
{
    ll a,b;
    read(n);read(m);read(a);read(b);
    for(register int i=1;i<=m;i++){
        read(q[i].x);
        read(q[i].y);
    }
    if(2*a <= b)
        printf("%lld\n",(2*n-1)*a);
    else{
        sort(q+1,q+1+m);
        int s = 0;
        for(int i=1;i<=m;i++){
            int k = i;
            if(!s||st[s]<q[i].y)st[++s] = q[i].y;
            else{
                int pos = lower_bound(st+1,st+1+s,q[i].y)-st;
                st[pos] = q[i].y;
            }
            while(q[k].x == q[i].x&&k<=n) k++;
            i = k-1;
        }
        printf("%lld\n",(2*n-(2*s))*a + s*b);
    }
    return 0;
}

C.有向无环图

考虑连成一个无向图

令fi代表从1~i的路径数量

然后你就会发现一些奇特的性质..

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
inline bool read(ll &num)
{char in;bool IsN=false;
    in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
int cnt = 2;
ll n,m,p;
struct No{
    int x,y;
};
vector<No>res;
int main()
{
    ll K,N;scanf("%llu%llu",&K,&N);
    __int128 temp = 1;
    while(temp<K){
        temp<<=1;
        cnt++;
    }
    //debug(cnt);
    for(int i=1;i<cnt;i++)
        for(int k=i+1;k<cnt;k++){
            res.push_back(No{i,k});
        }
    __int128 tempx = temp - K;
    for(int i=1;i<cnt;i++){
        if(i == 1) res.push_back(No{i,cnt});
        else if((tempx>>(i-2)&1)==0) res.push_back(No{i,cnt});
    }
    printf("%d %d\n",cnt,res.size());
    int sz = res.size();
    for(int i=0;i<sz;i++){
        printf("%d %d\n",res[i].x,res[i].y);
    }
    return 0;
}
/***
10 2
1 2
2 3
3 4
4 10
2 5
5 6
6 7
7 8
8 9
***/

D.分数

考虑首先每一个绝对会被质因子筛去一次

对于剩下的只有质因子的幂次

所以直接欧拉筛即可

8e7能开还是狠莽的..

Code:

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
ll n,m,p;
bool vis[maxn];
int prime[12000000],f[maxn];
int cnt = 0;
void set_prime()
{
    for(register int i=2;i<maxn;i++){
        if(!vis[i]) prime[++cnt]=i;
        for(register int j=1;j<=cnt&&prime[j]*i<maxn;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{
    ll a,b;
    set_prime();
    read(n);read(a);read(b);
    for(register int i=1;i<=cnt&&prime[i]<=n;i++){
        ll temp = prime[i];
        while(temp<=n){
            temp*=prime[i];
            if(temp <= n) f[temp] = prime[i];
        }
    }
    for(register int i=2;i<=n;i++){
        if(!vis[i]){
            a = (a*i+b);
            if(a>mod) a%=mod;
        }
        else if(f[i]){
            a = (a*f[i]+b);
            if(a>mod) a%=mod;
        }
    }
    printf("%lld\n",a);
    return 0;
}
/***
10 2
1 2
2 3
3 4
4 10
2 5
5 6
6 7
7 8
8 9
***/

总结:

rk53..没关系

不以弱于强者而自卑

不以强于弱者而骄傲

更重要的

不能被失落的低谷吞噬。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只酷酷光儿( CoolGuang)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值