昨天5小时鏖战,结果不尽人意,但好在还得了个铜奖,老师给我们报销了报名费,也算是不亏吧
,今天好好看了看昨天的比赛题,ACM的题果然都比较考验思维。
这次我就按难度从易到难,把最简单的7道题讲一下吧(相对而言,其实一点也不简单hh)
目录
F题:复读机

签到题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin>>x;
if(x==1)
{
cout<<"I love Heilongjiang"<<endl;
}
else if (x==0)
{
cout<<"I love CCPC"<<endl;
}
else cout<<"Error"<<endl;
return 0;
}
G题:卡卡数
推公式+快速幂逆元求组合数
这个就是自己整出一个公式就可以了,比如,x=n,那么就分成1占1位,1占2位......1占k位.....1占n位,如果1有k个,有C(k,n)种情况决定n的位置,那么剩下的n-k位就可能是0,2,3,4,5,6,7,8,9,9种可能,所以就有公式C(k,n)*k*(9^(n-k)),k从1~n累加就是最终结果了,由于数很大,所以要用快速幂求逆元的方法求组合数,也算是之前的板子没白整吧
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
LL fact[N],infact[N];
const int mod=998244353;
LL A[N];
LL qmi(LL a,int k)
{
LL res=1;
while(k)
{
if(k&1)res=res*a%mod;
a=a*a%mod;
k>>=1;
}
return res;
}
void init(int n)
{
fact[0]=1;
for(int i=1;i<=n;i++)
{
fact[i]=fact[i-1]*i%mod;
}
infact[n]=qmi(fact[n],mod-2);
for(int i=n-1;i>=0;i--)
{
infact[i]=infact[i+1]*(i+1)%mod;
}
A[0]=1;
for(int i=1;i<=n;i++)A[i]=A[i-1]*9%mod;
}
LL C(int a,int b)
{
if(a<0||a>b)return 0;
return fact[b]*infact[a]%mod*infact[b-a]%mod;
}
int main()
{
int n;
cin>>n;
init(n);
LL res=0;
//cout<<C(1,2)<<endl;
for(int i=1;i<=n;i++)
{
res=(res+C(i,n)*A[n-i]%mod*i%mod)%mod;
//cout<<C(i,n)<<' '<<A[i]<<' '<<i<<endl;
}
cout<<res<<endl;
return 0;
}
H题:周二会员日


高精度
这个题一开始以为是签到题,但是发现它说要与标准答案完全相同,才发现要用高精度,公式还是很好推的,就是(x*2-1)*2-1嘛,当然处理时要先*100,所以减的时候也是减100,然后就是套模版就可以了
#include<bits/stdc++.h>
using namespace std;
vector<int>A,B,C;
void sub(vector<int>&A,vector<int>&B)
{
int t=0;
for(int i=0;i<A.size();i++)
{
t=A[i]-t;
if(i<B.size())t-=B[i];
C.push_back((t+10)%10);
if(t<0)t=1;
else t=0;
}
while(C.size()>1&&C.back()==0)C.pop_back();
}
void mul(vector<int>&A,int b)
{
int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size())t+=A[i]*b;
C.push_back(t%1



1466

被折叠的 条评论
为什么被折叠?



