上午讲课实况:各种数论
125!!!历史新高。。。
似乎很正常的样子
先T1
求C(m,n)。
肯定不是暴力啊。。。
还是写个暴力吧打表找规律啊。。。
先打个5*5吧
如图
所以。。。我发现规律了
m\n | 1 | 2 | 3 | 4 | 5 |
1 | 1 | 2 | 3 | 4 | 5 |
2 | 0 | 1 | 3 | 6 | 10 |
3 | 0 | 0 | 1 | 4 | 10 |
4 | 0 | 0 | 0 | 1 | 5 |
5 | 0 | 0 | 0 | 0 | 1 |
C(m,n)=C(m-1,n-1)+C(m-1,n)
规律有了,递推啊、、、
然后发现20000的数据范围炸空间啊、、、
卧槽咋办啊
然后:
我发现个问题啊
求第二列需要第一列
求第三列需要第二列,第一列没用啊
卧槽
俩数组,20000的,丫的再爆空间。。。
好了俩数组来回倒妥了!
开开心心写了半个小时,看了下极限数据差不多能多;
然后就扔下了
然后T2
求满足1/N!=1/X+1/Y的(X,Y)。
依然打表
没规律
然后我就想:
x和y肯定比N!大好多啊!
所以设a=n!,x=a+b,y=a+c
所以1/a=1/(a+b)+1/(a+c)
所以1/a=(2a+b+c)/((a+b)*(a+c))
所以1/a=1/(a+b)+1/(a+c)
所以1/a=(2a+b+c)/((a+b)*(a+c))
交叉相乘得a^2=b*c
所以这道题目便是求n!平方的约数个数的问题了。
求n!的约数个数可以使用分解质因数去解决。
所以这道题目便是求n!平方的约数个数的问题了。
求n!的约数个数可以使用分解质因数去解决。
求质因数咋求来着
我写过博客:求阶乘末尾零的个数,那不就是求5的个数吗
质数的个数不就都可以这么求吗
卧槽好像没毛病啊
写吧。。。写了一个小时过样例
成功。
就扔下拉
最后T3
题目大意:
f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7
给N求f(N)。
a和b得1的时候不就是斐波那契吗
这玩意模7???打表啊。。。
打了半天发现不是7出循环就是49
我c那就49了
写啊
写啊
写啊
写了好久
卧槽我AK了???
颓。。。颓到结束。。。
然而还是有大坑。。。
总结与反思
100+0+25
我看成绩单:
卧槽第一题AC
卧槽第二题0分
啊没开long long
卧槽第三题25???
啊还有42环的
没人AK???
T3正解:裸矩阵乘法!!!!!!!
卧槽。。。
第一题正解预处理1~2000的逆元,使用lucas定理把缩小至9901以内,再计算。
还是打表大法好。。。
代码
放第一题AC代码
#include <cstdio>
using namespace std;
const int MOD=9901;
int a[20005]={0,1};
int b[20005];
int main()
{
freopen("comb.in","r",stdin);
freopen("comb.out","w",stdout);
int n,m,line=1;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)
{
line=i%2;
if(line==0)
{
b[1]=i;
for(int j=2;j<=m;j++)
{
b[j]=(a[j]+a[j-1])%MOD;
}
line=1;
}
if(line==1)
{
a[1]=i;
for(int j=2;j<=m;j++)
{
a[j]=(b[j]+b[j-1])%MOD;
}
line=0;
}
}
if(n%2==1)
{
printf("%d",a[m]);
}
else
printf("%d",b[m]);
return 0;
}