比赛:2021-08-12:A

题目大意

若数列A存在位置k,满足
①i<k,ai<ai+1
②i>=k,ai>ai+1
则称该数列为单峰数列
给出正整数n,求全排列n中存在多少个单峰数列

题目分析

对于每个\(n\)\(ans=2^{n-1}\),为什么我也不知道,暴力的时候找到的规律,用快速幂乘一下真就\(AC\)了。

\(Code\)

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
#define sco 100010
using namespace std;
ll n,x,l,r,ans[sco],tot(0);
void solve(ll y){
	for(int d=0;d<=n/y;++d){
		if((d*y-2)%(n/y)==0)ans[++tot]=d*y-1;
		if((d*y+2)%(n/y)==0)ans[++tot]=d*y+1;
	}
}
int main(){
	scanf("%lld",&n);
	if(n==1){printf("None");return 0;}
	int siz=sqrt(n);
	for(ll i=1;i<=siz;++i){
		if(n%i==0){solve(n/i);}
	}
	sort(ans+1,ans+1+tot);
	l=1,r=unique(ans+1,ans+1+tot)-ans-1;
	while(ans[r]>n)--r;
	while(ans[l]<0)++l;
	for(int i=l;i<=r;++i)printf("%d\n",ans[i]);
	return 0;
}
posted @ 2021-08-18 21:59  ssl_lhj  阅读(25)  评论(0)    收藏  举报