2017 ACM-ICPC 亚洲区(西安赛区)网络赛

B题:

题意:

询问硬币K次,正面朝上次数为偶数。

思路: 这位大佬说的很好 -> 传送门


那么这道题目就变成了一个 求概率的问题。
很容易得到一个公式 P=C(k,n)*  p^n  *(1-p)^(k-n);
N的值从0-最大小于K的偶数。这样我们只需要求和就可以。
分母恒为p^n,但这个式子中的分子组合数太大,简单处理必然有问题。

现在我们需要用到一个概率与数理统计里面的公式

  

假设为a和b,这道题目的两个概率a+b为1. 所以最后的答案是1^n
我们把这个式子展开,设每一项为D1,+D2+D3+D4…Dn=1;
现在进行变形,令a为-a,那么上式展开后就变成D1-D2+D3-D4…+Dn=(一个可以求的值)
把这两个式子相加除以二就可以求得偶数项的求和值,就是我们要的答案。
上面说的可以求的值就是 ( 【(p-2q)/p】^n+1)/2;

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll p, q, n;

ll qmod(ll x, ll q)
{
    ll res = 1;
    while(q)
    {
        if(q%2) res = res*x%mod;
        x = x*x%mod;
        q /= 2;
    }
    return res;
}

int main(void)
{
    int _;
    cin >> _;
    while(_--)
    {
        scanf("%lld%lld%lld", &p, &q, &n);
        ll ni2 = qmod(2LL, mod-2);
        ll fm = qmod(p, n);
        ll fz = qmod(p-2*q, n);
        ll nifm = qmod(fm, mod-2);
        ll tmp = (1+fz*nifm%mod)%mod*ni2%mod;
        printf("%lld\n", tmp);
    }
    return 0;
}


C题

题意:

S(x)的值是一个数的十进制表示,所有位数之和,现在S(k*x)%233=0;问你K的值是多少。

思路:

把原来的数每一位都变成233个就好了, 这样每个数的每一位最后一定是233的倍数,具体就是*10000(原来数的长度);

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//char str[105];

int main(void)
{
    int _;
    cin >> _;
    while(_--)
    {
        int x;
        scanf("%d", &x);
        int len = 0;
        while(x)
        {
            x /= 10;
            len++;
        }
        for(int i = 1; i <= 233; i++)
        {
            for(int j = 0; j < len-1; j++)
            {
                printf("0");
            }
            printf("1");
        }
        puts("");
    }
    return 0;
}

E

题意:

n个点,编号0-n-1, 每个点i连向 i+1 到 n-1 之间的所有的点, 容量是 i^j,打表找规律。。不知道正解什么。。

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll fac[63] = {1, 1}, limit[63] = {0, 3};
ll ans[100], step[100] = {1, 1};
ll num[100];

void init()
{
    for(int i = 2; i <= 61; i++)
        fac[i] = fac[i-1]*2*2%mod, step[i] = step[i-1]*2;
//    cout << fac[1] << endl;
    limit[2] = 5;
    for(int i = 3; i <= 61; i++)
        limit[i] = limit[i-1]*2-1;
    for(int i = 1; i <= 61; i++)
        limit[i] -= step[i];
//    for(int i = 1; i <= 5; i++)
//        cout << fac[i] << ' ' << limit[i] <<endl;
//    cout << limit[1];
}

int main(void)
{
//    freopen("my.txt", "w", stdout);
    init();
//    for(int i = 1; i <= 61; i++)
//        cout << limit[i] << ' ' << step[i] << ' ' << fac[i] << endl;
    ll n;
    while(~scanf("%lld", &n))
    {
        memset(ans, 0, sizeof(ans));
        memset(num, 0, sizeof(num));
        ll pre = 0;
        for(int i = 61; i >= 1; i--)
        {
            num[i] = ((max(0LL, n-limit[i])/step[i])-pre+mod)%mod;
            ans[i] = num[i]*(fac[i]+1)%mod;
            pre = (pre+num[i])%mod;
        }
        ll res = 1;
        for(int i = 1; i <= 61; i++)
            res = (res+ans[i])%mod;
        printf("%lld\n", res);
    }
    return 0;
}
/*
1000000000000000000
*/

F

转自: 队友shilongbao收集的资料

思路:手算了几项,然后把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

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
const int mod = 998244353;
ll fac[maxn] = {1};
ll n, m;

void init()
{
    for(int i = 1; i < maxn; i++)
        fac[i] = fac[i-1]*i%mod;
}

ll qmod(ll x, int q)
{
    ll res = 1;
    while(q)
    {
        if(q%2) res = res*x%mod;
        x = x*x%mod;
        q /= 2;
    }
    return res;
}

int main(void)
{
    init();
    while(~scanf("%lld%lld", &n, &m))
    {
        if(m > n) puts("0");
        else if(n%2 && m%2 == 0) puts("0");
        else if(n%2 == 0 && m%2) puts("0");
        else
        {
            ll fz = n%mod;
            if(m >= 1)
            {
                for(int i = n-m+1; i <= n+m-1; i++)
                {
                    if(i%2 == (n+m-2)%2)
                    {
                        fz = fz*i%mod;
                    }
                }
                ll tmp = fz*qmod(fac[m], mod-2)%mod;
                if((n-m)/2%2) tmp = -tmp;
                printf("%lld\n", (tmp+mod)%mod);
            }
            else
            {
                ll t = 1;
                for(int i = n+m-1; i <= n-m; i++)
                {
                    if(i%2 == (n+m-2)%2)
                        t = t*i%mod;
                }
                ll tmp = fz*qmod(fac[m], mod-2)%mod*qmod(t, mod-2)%mod;
                if((n-m)/2%2) tmp = -tmp;
                printf("%lld\n", (tmp+mod)%mod);
            }
        }
    }
    return 0;
}









思路:手算了几项,然后把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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值