多比特杯武汉工程大学第四届ACM程序设计竞赛同步赛

比赛链接

多比特杯武汉工程大学第四届ACM程序设计竞赛同步赛

E.讨厌的字符串

题目描述

现在你的面前有一个字符串长度为 \(n\),你看他很不爽所以你想将它一刀两断,你可以从中间切一刀使字符串变成两半,我们将前一半记作\(s_1\),将剩下一半记作\(s_2\),如果满足\(s_1\)\(s_2\) 中都没有前导0并且存在两个正整数\(c\),\(d\)使得 \(d\%c==0\) (即\(d\)\(c\)的倍数) \(\&\&\) \(d/c==s1\) \(\&\& c*d==s2\) 那么我们把这种分发成为一种合法拆分方式,如果一个字符串有2种或者2种以上的合法拆分方式那样我们就把这个字符串成为一个合法字符串。
现在给定一个正整数 \(n (1\leq n \leq 300\))请问是否可以构造出一个合法字符串,如果可以请在第一行输出'YES'否则输出'NO'

输入描述:

输入一个正整数 \(n (1\leq n \leq 300)\)

输出描述:

输出 'YES' 或者 'NO' (不包含引号)

示例1

输入

9

输出

YES

说明

s = 164000000

示例2

输入

10

输出

YES

说明

s = 1144000000

解题思路

构造

结论:对于大于 \(3\) 的数都满足条件

  • 对于大于 \(3\) 的奇数,字符串可以为 \(1640...00(n-3 个 0)\)
    此时可以构造出两种方案:
  1. \(s1=1,s2=640...00(n-3 个 0)\),此时 \(d=c=80...00(\frac{n-3}{2} 个 0)\)
  2. \(s1=16,s2=40...00(n-3 个 0)\),此时 \(d=80...00(\frac{n-3}{2} 个 0),c=50...00(n-4-\frac{n-3}{2}个 0)\)
  • 对于大于 \(3\) 的偶数,字符串可以为 \(11440...00(n-2 个 0)\)
    此时可以构造出两种方案:
  1. \(s1=1,s2=1440...00(n-2 个 0)\),此时 \(d=c=120...00(\frac{n-2}{2} 个 0)\)
  2. \(s1=11,s2=440...00(n-2 个 0)\),此时 \(d=220...00(\frac{n-2}{2} 个 0),c=20...00(\frac{n-2}{2} 个 0)\)
  • 时间复杂度:\(O(1)\)

代码

// Problem: 讨厌的字符串
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/33616/E
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
// #define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=1e3+5;
bool f[N];
int cal(int x)
{
	string s=to_string(x);
	return s.size();
}
int main()
{
    int n;
    cin>>n;
	puts(n>=4?"YES":"NO");
    return 0;
}
posted @ 2022-05-08 23:15  zyy2001  阅读(40)  评论(0编辑  收藏  举报