B题:
题意:
询问硬币K次,正面朝上次数为偶数。
思路: 这位大佬说的很好 -> 传送门
很容易得到一个公式 P=C(k,n)* p^n *(1-p)^(k-n);
N的值从0-最大小于K的偶数。这样我们只需要求和就可以。
分母恒为p^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
思路:手算了几项,然后把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
还有注意下"!!"的约分,可能下面的比上面的大