基准时间限制:1 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
小明对三角函数充满了兴趣,有一天他突然发现一个神奇的性质。
2cos(nx)似乎可以表示成2cos(x)的一个多项式。
但是小明并不能证明它的正确性。
现在给定n,问是否可以表示成这样的多项式,如果可以,只需输出各项系数的和。(Tip:如果这个和很大,那就高精度咯:))
否则输出No
样例解释:2*cos(3x)=(2*cosx)^3-3*(2*cosx),系数为1和-3,他们的和为-2。
Input
一个数表示n(n<=1e15)
Output
如果能表示 输出各项系数和 不能 输出No
Input示例
3
Output示例
-2
UsedToBe
(题目提供者)
Visual C++的运行时限为:1000 ms ,空间限制为:131072 KB
示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
令2*cos(nx)=a1*(2cos(x))^m1+a2*(2cos(x))^m2+......
一眼看过去感觉很难啊,难道求一波展开式? 仔细观察等号右边。为了省去繁琐复杂的质数。我们通常怎么做?
是不是把底数统统换成1,没错就是这样。呢怎么让2*cos(x)=1呢。呢不就是x=π/3嘛
因此令x=π/3带入求出所有2*cos(nx)的值,也就是系数之和的所有可能情况,因为是三角函数,所以是具有周期性的。
当然,这道题也可以打表找规律。
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define maxn 1008050
#define lowbit(x) (x&-x)
#define eps 1e-9
int main(void)
{
ll n;
scanf("%lld",&n);
if(n%6==1 || n%6==5)
printf("1\n");
else if(n%6==2 || n%6==4)
printf("-1\n");
else if(n%6==3)
printf("-2\n");
else
printf("2\n");
return 0;
}