我好菜啊
前言
其实突然发现不应该在期末考试前两天比赛的,但是,唉
洛谷 5436 T1缘分
题目
找出不超过 n n n的正整数 a , b a,b a,b,使 l c m ( a , b ) lcm(a,b) lcm(a,b)最大
分析
8min: l c m ( a , b ) = a b g c d ( a , b ) lcm(a,b)=\frac{ab}{gcd(a,b)} lcm(a,b)=gcd(a,b)ab,就是让 g c d ( a , b ) gcd(a,b) gcd(a,b)尽量小,并让 a b ab ab尽量大,那就是两个互质的数使它乘积变大,那不就是 n ( n − 1 ) n(n-1) n(n−1)吗,交上去WA
16min:莫非多组数据每组都卡掉了,嗯嗯嗯嗯, n = 1 n=1 n=1时要特判答案为1,AC
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(long long ans){
if (ans>9) print(ans/10); putchar(ans%10+48);}
signed main(){
for (rr int t=iut(),n;t;--t){
n=iut();
if (n==1) putchar(49);
else print(1ll*n*(n-1));
putchar(10);
}
return 0;
}
洛谷 5440 T2奇迹
题目
有一个可能残缺的八位日历,问有多少种真实存在的日历满足“年+月+日”、“月+日”、“日”都是质数
分析
能改很久的深搜题,几个坑点
- 要判断平年闰年以及2月的天数
- 判断质数的条件
- 其实也没什么,根据格里历,1582年10月5日到1582年10月14日被删除了,然而并没有什么用,因为即使真实存在也不合法
时间复杂度 O ( 能 过 ) O(能过) O(能过)
代码
#include <cstdio>
#include <cctype>
#include <cmath>
#define rr register
using namespace std;
const int d[13]={
0,31,29,31,30,31,30,31,31,30,31,30,31};
bool v[10001]; int prime[1231],cnt,a[11],ans; char s[11];
inline void dfs(int dep,int now){
if (dep>7){
rr int now1=now/10000,now2=now%10000,now3=now%100; now2=now2/100;
if (!(now1%400==0||(now1%100&&now1%4==0))&&now2==2&&now3==29) return;//平年出现29天?
if (d[now2]<now3||v[now2*100+now3]||v[now3]) return;//不存在这种月份或者月+日或日不是质数
rr int t=sqrt(now);
for (rr int i=2;i<=cnt&&prime[i]<=t;++i)
if (now%prime[i]==0) return;
++ans;
return;
}
switch (dep){
case 0:case 1:case 2:case 3:{
now=(now<<3)+(now<<1)+a[dep];
if (dep==3&&!a[dep]&&!now) return;//0000不可以
now+=dep==3&&now==-1;
if (~a[dep]) dfs(dep+1,now);
else for (rr int i=dep==3&&!now;i<10;++i)
dfs(dep+1,++now);
}break;
case 4:{
if (~a[dep]) dfs(dep+1,(now<<3)+(now<<1)+a[dep]);
else dfs(dep+1,(now<<3)+(now<<1)),dfs(dep+1,(now<<3)+(now<<1)+1);
}break;
case 5:{
if (~a[