SDNU ACM-ICPC 2020 Freshman‘s first monthly competition(11-15)【解题报告】

EtherCAT主站SOEM -- 24 -- 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站 以上就是EtherCAT主站SOEM – 23 – 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。 阅读详情

前言

\quad 激动人心的新生月赛终于来了!经过一个多星期的比赛准备,这套题目呈现在大家面前。

\quad 为了尽量避免锅的出现,这次集结了 17,18,19 全部队员参与命题与验题工作,简直是 SDNU-ACM 有史以来最为浩大的工程(要是今天现场出锅就刺激了)。

\quad UPD:MD,今天还是出锅了。

说明

\quad 以下内容为现场赛时写的,一边看榜,一边写,所以是按照每道题被拿走FB的顺序写的。

题解

1616.Arithmetic Sequence[签到]

出题人:ymf \quad 验题人:lhr、wx、lzw

\quad 全场最简单的题目,于 00:02:57 被 2020Wangweiyi 拿走全场 First Blood!

题目大意

\quad 给出一个整数 S S S,要求你构造一个长度最短的等差数列,使其和为 S S S.

分析

\quad 直接输出 S S S 不就好啦.

\quad 小坑点: m a x ( S ) = I N T _ M A X + 1 max(S) = INT\_MAX + 1 max(S)=INT_MAX+1,需要使用 l o n g    l o n g long\; long longlong 读入.

\quad 时间复杂度: O ( 1 ) O(1) O(1).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e5;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;

void work()
{
    ll s; scanf("%lld", &s);
    printf("%lld\n", s);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1625.星球大战1[思维 + 枚举]

出题人:lra \quad 验题人:lhr、lzw

\quad 00:52:10 FB 诞生,By:ronargo

题目大意

在这里插入图片描述
\quad 如上图所示,在一个平面直角坐标系的以 ( 0 , 0 ) (0,0) (0,0) 为左下角、 ( N , N ) (N,N) (N,N) 为右上角的矩形中,求在原点向周围看去,能看到多少个点。

分析

\quad 不难(用)证明,一个点 ( x , y ) (x,y) (x,y) 能被看到当且仅当 g c d ( x , y ) = 1 gcd(x,y)=1 gcd(x,y)=1.

\quad 由于 n n n 最大只有 2000 2000 2000,因此我们可以暴力枚举 x x x 和 y y y,时间复杂度为 O ( n 2 l o g ( n ) ) O(n^2log(n)) O(n2log(n)).

\quad 小坑点:特判 n = 1 n=1 n=1 的情形.

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e6;
const int N = (int)5e3;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

void work()
{
    int n; scanf("%d", &n);
    if(n == 1)
    {
        printf("0\n");
        return;
    }
    int ans = 3;
    for(int i = 1; i <= n - 1; ++i) for(int j = 1; j <= n - 1; ++j) ans += (gcd(i, j) == 1);
    printf("%d\n", ans - 1);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1622.蓝精精的浏览器[栈模拟]

出题人:qp \quad 验题人:lhr

\quad 00:57:30 FB 诞生,By:20luwei

题目大意

\quad 题面简单易懂(没看懂的去骂 qp 吧)

分析

\quad 之前 lzw 讲过括号匹配,跟这道题很是相似,直接看代码吧.

\quad 时间复杂度: O ( 能 过 ) O(能过) O(能过).

代码实现

\quad 20luwei 小伙汁代码写得不错,就把你的放出来吧!

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <stack>
using namespace std; 

stack<string> a;
stack<string> b;
string t;
string s;
int forward = 0, back = 0;

int main()
{
	a.push("http://www.acm.org/");
	while(cin >> t)
	{
		if(t == "VISIT")
		{
			while(!b.empty()) b.pop();
			cin >> s;
			a.push(s); 
			cout << a.top() << '\n';
		}
		
		else if(t == "BACK")
		{
			if(a.size() != 1)
			{
				b.push(a.top());
				a.pop();
				cout << a.top() << '\n';
			}
			else
			{
				cout << "Ignored" << '\n';
			}
		}
		
		else if(t == "FORWARD")
		{
			if(!b.empty())
			{
				a.push(b.top());
				b.pop();
				cout << a.top() << '\n';
			}
			else cout << "Ignored" << '\n';
		}
		
		else if(t == "QUIT") break;
	}
	
	return 0;
}

1623.闷声发大财[小思维]

出题人:sly \quad 验题人:lhr、lzw

\quad 01:56:22 FB 诞生,By:2020Wangweiyi 。

\quad 两个一血了啊,不愧是你!

题目大意

\quad 中文题

分析

\quad 代码里写了注释,自己模拟一下就懂了.

\quad 时间复杂度: O ( m ) O(m) O(m).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e5;
const int N = (int)5e3;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

int n, m;
bool r[M + 5];
bool c[M + 5];
int rcnt, ccnt;

void work()
{
    scanf("%d %d", &n, &m);
    rcnt = n, ccnt = n;
    for(int i = 1, x, y; i <= m; ++i)
    {
        scanf("%d %d", &x, &y);
        if(!r[x]) r[x] = 1, --rcnt;
        if(!c[y]) c[y] = 1, --ccnt;
        printf("%lld%c", 1ll * rcnt * ccnt, i == m ? '\n' : ' ');
    }
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1626.星球大战2[欧拉函数前缀和]

出题人:lra \quad 验题人:lhr、zlk、xwj、lzw、xsh

\quad 再次被 2020Wangweiyi 于03:11:30拿走 First Blood 。

题目大意

\quad 同 1625.星球大战1

分析

\quad 接 1625.星球大战1 的分析

\quad 用力推一下式子,发现答案就是 3 + 2 ∑ i = 1 n − 1 φ ( i ) 3 + 2\sum_{i=1}^{n-1}{\varphi(i)} 3+2∑i=1n−1​φ(i),套上线性筛直接搞就行.

\quad 时间复杂度: O ( n ) O(n) O(n).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)4e4;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

bool is_prime[M + 5];
int prime[M + 5], cnt;
int phi[M + 5];//欧拉函数

void init()
{
    memset(is_prime, 1, sizeof(is_prime));
    is_prime[0] = is_prime[1] = 0;
    phi[1] = 1;
    for(int i = 2; i <= M; ++i)
    {
        if(is_prime[i])
        {
            prime[++cnt] = i;
            phi[i] = i - 1;
        }
        for(int j = 1; j <= cnt && i * prime[j] <= M; ++j)
        {
            is_prime[i * prime[j]] = 0;
            if(i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}

void work()
{
    int n; scanf("%d", &n);
    if(n == 1)
    {
        printf("0\n");
        return;
    }
    ll ans = 3;
    for(int i = 2; i <= n - 1; ++i) ans += 2 * phi[i];
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    init();
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1627.最短的题[枚举]

出题人:xwj \quad 验题人:lhr、lra,lzw

\quad 02:15:08 又又又又 被 2020wangweiyi 拿走 FB 。

题目大意

\quad 从 n 个数中选 n - 1 个数使得它们或和(或运算的和)最大,输出这个最大值.

分析

\quad 枚举哪一个数不选,暴力更新答案即可.

\quad 时间复杂度: O ( n ) O(n) O(n).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)4e4;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

int n;
ll a[M + 5];
int c[64];

void work()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%lld", &a[i]);
        for(int j = 62; j >= 0; --j) c[j] += (a[i]>>j&1);
    }

    ll mx = 0;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 62; j >= 0; --j) c[j] -= (a[i]>>j&1);
        ll tmp = 0; for(int j = 62; j >= 0; --j) if(c[j]) tmp |= (1ll<<j);
        mx = max(mx, tmp);
        for(int j = 62; j >= 0; --j) c[j] += (a[i]>>j&1);
    }
    printf("%lld\n", mx);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}
出题人更优秀的做法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-11;
const ll N = 1e5 + 10;

ll a[N], pre[N], las[N];

int main() {
    ll n;
    scanf("%lld", &n);
    for(ll i = 1; i <= n; ++i) scanf("%lld", &a[i]);
    pre[1] = a[1];
    for(ll i = 2; i <= n; ++i) pre[i] = pre[i - 1] | a[i];
    las[n] = a[n];
    for(ll i = n - 1; i >= 1; --i) las[i] = las[i + 1] | a[i];
    ll ans = 0;
    for(ll i = 1; i <= n; ++i)
        ans = max(ans, pre[i - 1] | las[i + 1]);
    printf("%lld\n", ans);
    return 0;
}

1617.HR的双十一[枚举 + 快速幂 + 逆元]

出题人:lzw \quad 验题人:lhr
题目大意

\quad 嗯。

分析

\quad 枚举 i i i 表示第 i i i 天后 LHR 喵币总数 ≥ M \geq M ≥M 且 第 i − 1 i - 1 i−1 天后 LHR 喵币总数 < M \lt M <M,那么该情况的收益为 ∑ j = i n 1 = ( n − i + 1 ) ( i + n ) 2 \sum_{j=i}^n{1} = \frac{(n - i + 1)(i + n)}{2} ∑j=in​1=2(n−i+1)(i+n)​,发生的概率为 C i − 1 ⌈ M x ⌉ − 1 p ⌈ M x ⌉ ( 1 − p ) i − ⌈ M x ⌉ C_{i - 1}^{\lceil{\frac{M}{x}}\rceil - 1} p^{\lceil{\frac{M}{x}}\rceil}(1-p)^{i - \lceil{\frac{M}{x}}\rceil} Ci−1⌈xM​⌉−1​p⌈xM​⌉(1−p)i−⌈xM​⌉.

\quad 小坑点:1. 求 p p p 的时候需要求 100 100 100 在模 998244353 998244353 998244353 的逆元
\quad\quad\quad\quad 2. 特判 x = 0 x=0 x=0 和 k = 0 k = 0 k=0 的情况

\quad 时间复杂度: O ( n l o g ⌈ m x ⌉ ) O(n log\lceil \frac{m}{x} \rceil) O(nlog⌈xm​⌉),再用力一点能优化到 O ( n ) O(n) O(n).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e3;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;

int n, x, m, p;
ll c[M + 5][M + 5];

void init()
{
    c[0][0] = 1;
    for(int i = 1; i <= M; ++i)
    {
        c[i][0] = 1;
        for(int j = 1; j <= i; ++j) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
    }
}

ll quick(ll a, ll b, ll p = mod)
{
    ll s = 1;
    while(b)
    {
        if(b & 1) s = s * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return s;
}

ll inv(ll n, ll p = mod)
{
    return quick(n, p - 2, p);
}

void work()
{
    scanf("%d %d %d %d", &n, &x, &m, &p);
    p = p * inv(100) % mod;
    int q = ((1 - p) % mod + mod) % mod;
    ll ans = 0, cur;
    if(x == 0)
    {
        if(m == 0) printf("%lld\n", 1ll * n * (n + 1) / 2 % mod);
        else       printf("0\n");
        return;
    }
    int k = (m + x - 1) / x;
    if(k == 0)
    {
        printf("%lld\n", 1ll * n * (n + 1) / 2 % mod);
        return;
    }
    for(int i = k; i <= n; ++i)
    {
        cur = 1ll * (n - i + 1) * (i + n) / 2 % mod;
        cur = cur * c[i - 1][k - 1] % mod * quick(p, k) % mod * quick(q, i - k) % mod;
        ans = (ans + cur) % mod;
    }
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    init();
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1618.The Guo[思维]

出题人:lzw \quad 验题人:lhr、wx
题目大意

\quad 啊。

分析

\quad 不难想到,如果初始地图所有的锅连在一起,那么最小花费为所有锅的和(一次全部修完,不留给锅精造锅的机会)

\quad 否则你至少需要休息一次。所以不论你如何操作,休息一次之后所有的点上都有锅,那么第二次修锅时就可以把所有锅清除掉。

\quad 时间复杂度: O ( n m ) O(nm) O(nm).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e3;
const int N = (int)5e3;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

int n, m;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

vector<vector<int> > mp;
vector<vector<bool> > vis;

struct node
{
    int x, y;
};

queue<node> q;

void bfs(int x, int y)
{
    node u, v;
    vis[u.x = x][u.y = y] = 1;
    q.push(u);
    while(!q.empty())
    {
        u = q.front(); q.pop();
        for(int i = 0; i < 4; ++i)
        {
            v.x = u.x + dx[i], v.y = u.y + dy[i];
            if(v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m && !vis[v.x][v.y] && mp[v.x][v.y])
            {
                vis[v.x][v.y] = 1;
                q.push(v);
            }
        }
    }
}

void work()
{
    scanf("%d %d", &n, &m);
    mp.resize(n + 1); vis.resize(n + 1);
    for(int i = 0; i <= n; ++i) mp[i].resize(m + 1), vis[i].resize(m + 1);
    for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) mp[i][j] = read();

    int zero = 0; ll sum = 0; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) zero += !mp[i][j], sum += mp[i][j];
    int blocks = 0; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) if(!vis[i][j] && mp[i][j]) bfs(i, j), ++blocks;

    if(blocks == 1) printf("%lld\n", sum);
    else            printf("%lld\n", sum + 1 + zero);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1619.The Super Guo[DFS + 贪心]

出题人:lhr \quad 验题人:syh、ymf、lzw、wx
题目大意

\quad 呀。

分析

\quad 显然,每次选取一个极大连通块是最优的(走到不能走为止),那么问题就变成了如何安排极大连通块的选择顺序,使用临项交换法可知贪心策略就是:优先选择格点数最多的连通块。

\quad 时间复杂度: O ( n m × l o g ( n m ) ) O(nm \times log(nm)) O(nm×log(nm)).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e5;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;

int n, m;

struct node1
{
    int x, y;
};

struct node2
{
    ll sum;
    int cnt;
};

vector<vector<int> > mp;
vector<vector<int> > vis;
vector<node2> block;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

int read()
{
    int f = 1, x = 0;
    char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

queue<node1> q;

void bfs(int x, int y)
{
    node1 u, v;
    u.x = x, u.y = y;
    q.push(u); vis[u.x][u.y] = 1;
    int cnt = 0; ll sum = 0;
    while(!q.empty())
    {
        u = q.front(); q.pop();
        ++cnt, sum += mp[u.x][u.y];
        for(int i = 0; i < 4; ++i)
        {
            v.x = u.x + dx[i], v.y = u.y + dy[i];
            if(v.x < 1 || v.x > n || v.y < 1 || v.y > m || !mp[v.x][v.y] || vis[v.x][v.y]) continue;
            vis[v.x][v.y] = 1;
            q.push(v);
        }
    }
    node2 tmp;
    tmp.cnt = cnt, tmp.sum = sum;
    block.push_back(tmp);
}

bool cmp(node2 a, node2 b)
{
    return a.cnt > b.cnt;
}

void work()
{
    n = read(); m = read();
    mp.resize(n + 1); vis.resize(n + 1);
    for(int i = 1; i <= n; ++i)
    {
        mp[i].resize(m + 1); vis[i].resize(m + 1);
        for(int j = 1; j <= m; ++j) mp[i][j] = read();
    }
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            if(mp[i][j] && !vis[i][j])
            {
                bfs(i, j);
            }
        }
    }
    sort(block.begin(), block.end(), cmp);
    int sz = block.size();
    ll ans = 0;
    for(int i = 0; i < sz; ++i)
    {
        ans += block[i].sum + 1ll * i * block[i].cnt;
    }
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1620.锅精精学数学[组合数学 + 分类讨论]

出题人:ryc \quad 验题人:lhr、lzw
题目大意

\quad 给定整数n,请你求出n的所有合数因子的乘积,由于结果可能过大,请对结果取模998244353。

分析

\quad 由唯一分解定理,将 n n n 表示为 n = p 1 c 1 p 2 c 2 ⋯ p k c k n = p_1^{c_1}p_2^{c_2}\cdots p_k^{c_k} n=p1c1​​p2c2​​⋯pkck​​.

\quad 记 τ ( n ) \tau(n) τ(n) 为 n n n 的正约数的个数,根据乘法原理有 τ ( n ) = ( c 1 + 1 ) ( c 2 + 1 ) ⋯ ( c k + 1 ) \tau(n) = (c_{1} + 1)(c_{2} + 1)\cdots(c_{k} + 1) τ(n)=(c1​+1)(c2​+1)⋯(ck​+1).

\quad 记 π ( n ) \pi(n) π(n) 为 n n n 的正约数的乘积,可以用力求得 π ( n ) = n τ ( n ) 2 \pi(n) = n^{\frac{\tau(n)}{2}} π(n)=n2τ(n)​.

\quad 然而题目所求为 n n n 的合数因子的乘积,所以答案为 π ( n ) p 1 p 2 ⋯ p k \frac{\pi(n)}{p_1p_2 \cdots p_k} p1​p2​⋯pk​π(n)​.

\quad 小细节: π ( n ) = n τ ( n ) 2 \pi(n) = n^{\frac{\tau(n)}{2}} π(n)=n2τ(n)​ 中 τ ( n ) \tau(n) τ(n) 可能为奇数,此时不能直接除以 2 2 2。由于 τ ( n ) \tau(n) τ(n) 为奇数,即 ( c 1 + 1 ) ( c 2 + 1 ) ⋯ ( c k + 1 ) (c_{1} + 1)(c_{2} + 1)\cdots(c_{k} + 1) (c1​+1)(c2​+1)⋯(ck​+1) 为奇数,可知 c 1 , c 2 , ⋯   , c k c_1,c_2,\cdots,c_k c1​,c2​,⋯,ck​ 都是偶数,即 n n n 为完全平方数,此时 n 1 2 n^{\frac{1}{2}} n21​ 为整数,所以 π ( n ) \pi(n) π(n) 可表示为 ( n 1 2 ) τ ( n ) (n^{\frac{1}{2}})^{\tau(n)} (n21​)τ(n).

\quad 小坑点:特判 n % 998244353 = 0 n \% 998244353 = 0 n%998244353=0 的情况.

\quad 时间复杂度: O ( n + l o g ( n ) l o g ( 998244353 ) ) O(\sqrt{n} +log(n) log(998244353)) O(n ​+log(n)log(998244353)).

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e7;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;

bool is_prime[M + 5];
int cnt, prime[M / 10 + 5];

int m;
struct node
{
    ll p; int c;
    node(ll _p = 0, int _c = 0): p(_p), c(_c){}
}v[100];

void init()
{
    memset(is_prime, 1, sizeof(is_prime));
    cnt = is_prime[0] = is_prime[1] = 0;
    for(int i = 2; i <= M; ++i)
    {
        if(is_prime[i]) prime[++cnt] = i;
        for(int j = 1; j <= cnt && i * prime[j] <= M; ++j)
        {
            is_prime[i * prime[j]] = 0;
            if(i % prime[j] == 0) break;
        }
    }
}

void divide(ll n)
{
    m = 0;
    for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= n; ++i)
    {
        if(n % prime[i] == 0)
        {
            ll c = 0;
            while(n % prime[i] == 0) ++c, n /= prime[i];
            v[m++] = node(prime[i], c);
        }
    }
    if(n > 1) v[m++] = node(n, 1);
}

ll quick(ll a, ll b, ll p = mod)
{
    ll s = 1;
    while(b)
    {
        if(b & 1) s = s * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return s;
}

ll inv(ll n, ll p = mod)
{
    return quick(n, p - 2, p);
}

void work(ll n)
{
    if(n == 998244353)
    {
        printf("1\n");
        return;
    }
    if(n % 998244353 == 0)
    {
        printf("0\n");
        return;
    }
    divide(n);
    ll k = 1;
    for(int i = 0; i < m; ++i) k *= v[i].c + 1;
    ll sq = (ll)(sqrt(n) + eps);
    if(sq * sq == n) n = sq;
    else             k /= 2;
    ll ans = quick(n % mod, k);
    for(int i = 0; i < m; ++i) ans = ans * inv(v[i].p % mod) % mod;
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    init();
    ll n; while(~scanf("%lld", &n)) work(n);
//    work();
//    int T; scanf("%d", &T);
//    while(T--) work();
    return 0;
}

1621.加密通话[思维]

出题人:zlk \quad 验题人:lzw
题目大意

\quad 呱。

分析

\quad 按照二进制位分析 So Easy.

\quad 只需要在题目所给代码的基础上加 3 3 3 行即可 AC.

\quad 时间复杂度: O ( n 2 n ) O(n2^n) O(n2n)

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e3;
const int N = (int)5e3;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

char s[M + 5];

void work()
{
    scanf("%s", s + 1);
    int n = (int)(log2(strlen(s + 1)) + eps) + 1;
    int p = 0;
    for(int i = 0; i < n; ++i)
    {
        int t = 0;
        for(int j = 1; j <= (1<<n) - 1; ++j)
        {
            if((1<<i)&j)    t ^= s[j];
        }
        if(t) p |= (1<<i);
    }
    s[p] ^= 1;
    printf("%s\n", s + 1);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    work();
    int T; scanf("%d", &T);
    while(T--) work();
    return 0;
}

1624.新型冠状病毒[组合数学]

出题人:lhr \quad 验题人:lzw
题目大意

\quad 哞。

分析

\quad 显然 答案为 C t x C t − x y C_t^xC_{t-x}^y Ctx​Ct−xy​.

\quad 时间复杂度: O ( 1 0 7 + T l o g ( 998244353 ) ) O(10^7 + Tlog(998244353)) O(107+Tlog(998244353))

代码实现
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e7;
const int N = (int)1e5;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)998244353;

ll fac[M + 5];

ll quick(ll a, ll b, ll p = mod)
{
    ll s = 1;
    while(b)
    {
        if(b & 1) s = s * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return s;
}

ll inv(ll n, ll p = mod)
{
    return quick(n, p - 2, p);
}

ll c(int n, int m)
{
    return fac[n] * inv(fac[m]) % mod * inv(fac[n - m]) % mod;
}

void work()
{
    int x, y, t;
    scanf("%d %d %d", &x, &y, &t);
    if(x > t || y > t - x) {printf("0\n"); return;}
    ll ans = 1;
    ans = ans * c(t, x) % mod;
    ans = ans * c(t - x, y) % mod;
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    work();
    fac[0] = 1; for(int i = 1; i <= M; ++i) fac[i] = fac[i - 1] * i % mod;
    int T; scanf("%d", &T);
    while(T--) work();
    return 0;
}

吐槽

  1. 办比赛真累,以后不想搞了(真香)。
  2. 这群人怎么回事,学了一个多月,除了暴力啥也不会(其实暴力也不会)?下周不得被齐工大锤爆

END

所以说,知道自己的真实实力最重要,不要因为一时的失败就觉得自己不行。

一定要多试几次你才会知道,自己真的不行。

ArcGIS Pro 3.4 二次开发 - 布局 本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK 阅读详情

相关推荐

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

Suryxin’s ACM退役记

我的记忆力很差,经历过的很多事情都已经记不太清了,其中有很多美好回忆也已经消散,我很惋惜没能留存一些照片和声音或是文字供我怀念,这就像《泰坦尼克号》一样,露丝和杰克感人肺腑的爱情故事,最后也仅仅存在于暮年露丝的回忆里。这四年所经历的一切,都是我这一生可遇而不可求的美好时光,有些事情我不想忘记,也不想最后只有我记得,所以我想以文字的形式记录并怀念一下这四年的ACM生活。

Suryxin's blogs 2285

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

2020 ACM新生赛(绝望赛)

hr师哥的题解奉上哞 1616.Arithmetic Sequence 题意:数列为等差数列,给你等差数列的和,求当数列数最少时的数列(坑点:第一行说数列可以为一个数) 所以直接输入输出就行 #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include &

Suryxin's blogs 1590

ArcGIS基于DEM提取微流域单元(附练习数据下载)

流域作为一个相对独立的地理单元,与行政区的划分有着本质上的区别。流域的划分更注重自然因素,流域作为一个综合的自然整体,在其内部形成了一个天然的物质与能量流动的场所,并通过水流的作用,与周围的区域进行物质和能量的交换。流域的精确划分作为一个研究的基础工作,那么接下来给大家说一下利用DEM提取小流域的案例教程——以贵州省遵义市正安县为例。 1 数据获取 地理空间数据云(http://www.gscloud.cn/),数据分辨率为30m。也可直接点击这篇直接下载→全国30m90mDEM下载。 若想要获得更高精度.

qq_43173805的博客 4835

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1770

从 n 个数中挑选出最大的数

/* 简单练习 */ /* 内容: 从 n 个数中挑选出最大的数 输入说明: 两行 第一行一个数n,表示总的个数 第二行共n个数字,用空格隔开。 输出说明: 一行,最大数 输入样例:help 4 1 2 3 4 输出样例 : 4 */ /* # include using namespace std ; int main () {

youshenxuzuo的专栏 3090

西门子博图指令(定时器操作三)

西门子博图定时器中复位定时器功能指令介绍

yue008的博客 8873

微软公司等数据结构+算法面试100题(第1-100题)全部出炉

微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相                        作者:July、2010年12月6日。更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.youkuaiyun.com/v_july_v/article/details/6870251。关于此100道面试题的所有一切详情,包括答案,资源

结构之法 算法之道 24万+

C# 实现文件和字符串的AES加密解密

C# 实现文件和字符串的AES128加密解密

m0_72044573的博客 5935

YOLOv13改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv13-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 355

选数--递归(从n个数中选出k个数进行求和运算--组合问题)

题目描述 已知n个整数x_1,x_2,…,x_n以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34 现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7...

小糊涂的博客 1万+

微信小程序 - 解决报错 {“errcode“:41002,“errmsg“:“appid missing, rid: X“} 微信报错错误码errcode“:41002问题分析及解决教程(详细排查)

【微信小程序】报错{“errcode“:41002,“errmsg“:“appid missing, rid: 64e55770-67c1fb7e-027c5a70“}:【微信小程序】微信小程序登录请求出现appid missing提示,微信公众号{"errcode":41002,"errmsg":"appid missing"},微信 报错{“errcode“:41002,“errmsg“:“appid missing,微信小程序获取openid返回appid missing的问题,微信小程序提示Erro

🏆 前端领域优质创作者 5658

ACM/ICPC竞赛之STL--string

ACM模版string字符串是程序中经常要表达和处理的数据,我们通常是采用字符数组或字符指针表示字符串。STL为我们提供了另一种使用起来更为便捷的字符串的表达方式:string。string类的定义在头文件<string>中。string类其实可以看作是一个字符的vector,vector上的各种操作都可以适用于string,另外,string类对对象还支持字符串的拼合、转换等操作。 Exampl

逐梦者 2658

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SDNU ACM-ICPC 2020 Competition For the End of Term(11-29)【解题报告】

文章目录前言说明题解1644.Euler YYDS![找规律]出题人:lhr \quad 验题人:ymf题目大意分析代码实现1649.Palindrome of prime number[模拟 + 暴力判断质数]出题人:wx \quad 验题人:lhr题目大意分析代码实现1652.The Magic LMR Ring[找规律]出题人:lhr \quad 验题人:题目大意分析代码实现1654.Treasure House[BFS + 记录路径]出题人:lhr \quad 验题人:题目大意分析代码实现1653.

The___Flash的博客 877

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

The 18th Zhejiang Provincial Collegiate Programming Contest L.String Freshman(KMP)

const int N=2e5+5; int n,m,_; int i,j,k; char a[N]; int f[N]; void getfail(char *s) { f[0]=f[1]=0; int len=strlen(s); for(int i=1;i<len;i++){ int j=f[i]; while(j && s[i]!=s[j]) j=f[j]; ...

C_Dreamy的博客 1331

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

实验 6 数组1题目1、输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标...

/*输出最大值和它所对应的下标*/ #include<stdio.h> int main(void) { int i,max,n; int a[10]; printf("输入n:"); scanf("%d",&n); printf("提示输入%d个数:",n); /*提示输入n个数*/ for(i=...

weixin_30487201的博客 3711

SDNU ACM-ICPC 2020 Competition For the End of Term(11-29) 1004、1012

1004: 题意:给定你一个为1到n的排列,对于这个序列的每一个不为空的子序列,都会存在一个最大值和最小值,然后每一次计算 最小值/最大值 的结果最后把所有的结果相乘,问你这个结果为多少? 思路:维护最大值和最小值,如果直接枚举k,然后求长度为k的最大值和最小值,单调栈,但是O(n2)O(n^2)O(n2)。所以考虑去优化这个想法,对于每一位的i,我们考虑这个位置上的数作为最大值或者最小值会产生的贡献。 贡献怎么算呢,每一个位置i的数aia_iai​单调栈维护这个数作为最小值和最大值的左右区间端点。最大和

forward77 169

Input-Output Lecture (3) for ACM Freshman

Description 给出两个正整数a和b,计算a+b的值。 Input 第一行是一个数字T,代表有T组输入。 接下来有T行,每行代表一组输入,每组包含两个不超过1000位的正整数a和b。 Output 对于每组输入,输出两行,第一行为”Case i:”(不包含双引号,其中i为第i组测试数据),第二行为a+b的值,每组测试数据之后加一个空行。 Samples inputCopy 2 1 5 1000000000000000000000000000000 1.

qq_63010655的博客 277

The 2021 ICPC Asia Regionals Online Contest (II)【解题报告】

戳我进入比赛 Problem A. Sort 题目大意 TTT 组,每组给出一个长度为 nnn 的序列 a[]a[]a[] 和 整数 kkk. 定义一次操作为将序列 a[]a[]a[] 分割成 viv_ivi​ 段,再对段做置换 pip_ipi​. 若在有限次数操作中,无法使得序列 a[]a[]a[] 变成非降序,则输出 −2-2−2. 若在有限次数操作中,可以使得序列 a[]a[]a[] 变成非降序,且 ∑vi≤3n\sum{v_i} \leq 3n∑vi​≤3n,则输出方案,否则输出 −1-1−1.

The___Flash的博客 1965

2020ICPC·小米 网络选拔赛第一场

先贴一份代码,之后再来写~~(咕)~~ A Intelligent Warehouse 三.代码实现 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = (int)2e5; const int N = (int)1e7; const double eps = 1e-9; const int inf = 0x3f3f3f3f; const ll mod = (ll)998244353

The___Flash的博客 1281

SDNU_ACM_ICPC_2020_Winter_Practice

VJudge: SDNU_ACM_ICPC_2020_Winter_Practice_1st SDNU_ACM_ICPC_2020_Winter_Practice_2nd SDNU_ACM_ICPC_2020_Winter_Practice_3rd SDNU_ACM_ICPC_2020_Winter_Practice_4th 牛客: SDNU_ACM_ICPC_2020_Winter_...

The___Flash的博客 1187

2022牛客寒假算法基础集训营4【解题报告】

戳我进入比赛 Problem A. R 题目大意 输入两个整数 n,kn,kn,k 和一个长度为 nnn 的字符串 sss. 问字符串 sss 中存在多少个子串满足该子串至少包含 kkk 个 ′R′'R'′R′ 字符,且不包含 ′P′'P'′P′ 字符. 1≤n≤2×105,1≤k≤20,s[i]∈{′A′−′Z′}1 \leq n \leq 2 \times 10^5, 1 \leq k \leq 20, s[i] \in \{'A'-'Z'\}1≤n≤2×105,1≤k≤20,s[i]∈{′A′−′Z

The___Flash的博客 987

2021牛客寒假算法基础集训营2【解题报告】

A 牛牛与牛妹的RMQ 题目描述 某天,牛妹来找牛牛学习RMQ算法(Range Minimum/Maximum Query),即区间最值查询。也就是给定一个数组区间[L,R],查询该子区间的最大值。 假设子数组的两端点下标分别为L,R的话RMQ(L,R)就表示数组区间[L,R]的最大值。 因为牛妹学会了RMQ算法,所以牛牛准备和她玩个游戏验证她真的学会了。 牛牛有一个长度大小为n的全排列数组,即数组中的数字是1~n,且每个数字仅出现1次。 她们一共玩了m轮游戏,在每轮游戏中,牛牛都准备了k个不同的下标。 然

The___Flash的博客 919

2021牛客寒假算法基础集训营1【解题报告】

A 串 题目描述 长度不超过 nnn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对 109+710^9+7109+7 取模。 所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。 例如,“unoacscc"包含子序列"us”,但"scscucu"则不包含子序列"us" 输入描述: 一个正整数 nnn(2≤n≤1062 \leq n \leq 10^62≤n≤106) 输出描述: 一个正整数,为满足条件的字符串数量对 109+710^9+7109+7 取模的值 分析: 设 f

The___Flash的博客 906

SDNU_ACM_ICPC_2020_Winter_Practice_2nd【解题报告】

如果有不懂的地方,那必是我讲得不够清楚,大家可以在评论区中提问或私聊. 对于文章中错误或者不妥的地方,也欢迎大家进行纠错. 目录 A - 【The__Flash】的矩阵 一、题目大意: 二、分析: 三、代码实现: 四、后继: B - 【The__Flash】的疑惑 一、题目大意: 二、分析: 三、代码实现: 四、后继: C - 【The__Flash】的电影 一、题目大...

The___Flash的博客 892
上一篇: 2020ICPC·小米 网络选拔赛第一场
下一篇: SDNU ACM-ICPC 2020 Competition For the End of Term(11-29)【解题报告】
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值