比赛: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;
}