cos(nx)有可转化公式:
转化如图:
例题:
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F
链接如下:
点击打开链接
注意:上下双阶乘可约掉一部分
除法用逆元
还有判断一下m和n的一些特殊值
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll pow_mod(ll a,ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
ll inv(ll x)
{
return pow_mod(x,mod-2);
}
int main()
{
ll n,m,k;
while(~scanf("%lld%lld",&n,&m))
{
if(n<m)
{
printf("0\n");
continue;
}
if(n%2==0&&m%2!=0)
{
printf("0\n");
continue;
}
if(n%2!=0&&m%2==0)
{
printf("0\n");
continue;
}
if(m==0&&n%2==0)
{
ll ans = 1;
if(((n-m)%4)!=0)
ans=-ans;
//cout<<"ans="<<ans<<endl;
printf("%lld\n",(ans+mod)%mod);
continue;
}
ll p=n;
ll q=1;
ll ans;
for(ll i=n-m+2;i<=n+m-2;i+=2)
p=(p*i)%mod;
for(ll i=1;i<=m;i++)
q=(q*i)%mod;
ans=p*inv(q)%mod;
if((n-m)%4!=0)
ans=-ans;
//cout<<"ans="<<ans<<endl;
printf("%lld\n",(ans+mod)%mod);
}
return 0;
}