2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function (切比雪夫多项式)

来源:互联网 发布:上海泛微网络 编辑:程序博客网 时间:2024/06/05 07:03

题意:




思路:手算了几项,然后把n为6的那一行输到OEIS,就搜到了切比雪夫多项式。

切比雪夫多项式前几项为:




The triangle a(n,m) begins:

n\m  0   1  2    3     4    5     6     7      8    9   10

0:   1

1:   0  1

2:  -1  0   2

3:   0 -3   0    4

4:   1  0  -8    0     8

5:   0  5   0  -20     0   16

6:  -1  0  18    0   -48    0    32

7:   0 -7   0   56     0 -112     0    64

8:   1  0 -32    0   160    0  -256     0    128

9:   0  9   0 -120     0  432     0  -576      0  256

10: -1  0  50    0  -400    0  1120     0  -1280    0  512


然后百度第一类切比雪夫多项式是这个公式:

注意"!!"不是阶乘的阶乘,而是不超过n且与n具有相同奇偶性的所有正整数连乘积。

n分类讨论下,当n为偶数时m=2*k, n为奇数时m=2*k-1

还有注意下"!!"的约分,可能下面的比上面的大


代码:

[cpp] view plain copy
  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. typedef long long ll;  
  4. const int maxn = 1e5+5;  
  5. const int mod = 998244353;  
  6. ll fac[maxn] = {1};  
  7. ll n, m;  
  8.   
  9. void init()  
  10. {  
  11.     for(int i = 1; i < maxn; i++)  
  12.         fac[i] = fac[i-1]*i%mod;  
  13. }  
  14.   
  15. ll qmod(ll x, int q)  
  16. {  
  17.     ll res = 1;  
  18.     while(q)  
  19.     {  
  20.         if(q%2) res = res*x%mod;  
  21.         x = x*x%mod;  
  22.         q /= 2;  
  23.     }  
  24.     return res;  
  25. }  
  26.   
  27. int main(void)  
  28. {  
  29.     init();  
  30.     while(~scanf("%lld%lld", &n, &m))  
  31.     {  
  32.         if(m > n) puts("0");  
  33.         else if(n%2 && m%2 == 0) puts("0");  
  34.         else if(n%2 == 0 && m%2) puts("0");  
  35.         else  
  36.         {  
  37.             ll fz = n%mod;  
  38.             if(m >= 1)  
  39.             {  
  40.                 for(int i = n-m+1; i <= n+m-1; i++)  
  41.                 {  
  42.                     if(i%2 == (n+m-2)%2)  
  43.                     {  
  44.                         fz = fz*i%mod;  
  45.                     }  
  46.                 }  
  47.                 ll tmp = fz*qmod(fac[m], mod-2)%mod;  
  48.                 if((n-m)/2%2) tmp = -tmp;  
  49.                 printf("%lld\n", (tmp+mod)%mod);  
  50.             }  
  51.             else  
  52.             {  
  53.                 ll t = 1;  
  54.                 for(int i = n+m-1; i <= n-m; i++)  
  55.                 {  
  56.                     if(i%2 == (n+m-2)%2)  
  57.                         t = t*i%mod;  
  58.                 }  
  59.                 ll tmp = fz*qmod(fac[m], mod-2)%mod*qmod(t, mod-2)%mod;  
  60.                 if((n-m)/2%2) tmp = -tmp;  
  61.                 printf("%lld\n", (tmp+mod)%mod);  
  62.             }  
  63.         }  
  64.     }  
  65.     return 0;  
  66. }  

The triangle a(n,m) begins:

n\m  0   1  2    3     4    5     6     7      8    9   10

0:   1

1:   0  1

2:  -1  0   2

3:   0 -3   0    4

4:   1  0  -8    0     8

5:   0  5   0  -20     0   16

6:  -1  0  18    0   -48    0    32

7:   0 -7   0   56     0 -112     0    64

8:   1  0 -32    0   160    0  -256     0    128

9:   0  9   0 -120     0  432     0  -576      0  256

10: -1  0  50    0  -400    0  1120     0  -1280    0  512

阅读全文
0 0
原创粉丝点击