2020 Multi-University Training Contest 5
总结一下,特别对于第二个题求a的逆元可以用pow_mod(a%mod,mod-2); 原来是错这里了
Paperfolding
思路:通过折纸可以发现,只有上下折纸还有只有左右折纸是一样的,然后再对比一下左右折一次,上下折一次可以发现是不一样的
都以2次为例
左右(2次) 10
上下(2次) 10
左右上下(各一次) 9
我们可以推出公式
然后就是求期望
化简可得
code:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll n;
ll pow_mod(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
int T;
cin>>T;
while(T--){
cin>>n;
ll x=(pow_mod(2,n)+1)%mod;
ll y=(2*pow_mod(3,n)%mod*pow_mod(pow_mod(2,n),mod-2)%mod)%mod;
ll ans=(x+y)%mod;
cout<<ans<<endl;
}
return 0;
}
Tetrahedron
思路:根据直角四面体的性质可得到 底面的平方等于侧面的 平方和,
要注意一下这个底面肯定是一个锐角三角形
可以通过面积公式:
推出
最终公式:
找了半天的bug:求a的逆元可以用pow_mod(a%mod,mod-2) a一定要带上a%mod;
code:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int N=6e6+10;
int n;
ll sum[N];
ll pow_mod(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
for(ll i=1;i<=6e6;i++){
ll temp=pow_mod(i*i%mod,mod-2);//注意一下这里面也要取余的
sum[i]=(sum[i-1]+temp)%mod;
}
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ll x=(3*pow_mod(n,mod-2))%mod;
ll ans=(x*sum[n])%mod;
printf("%lld\n",ans);
}
return 0;
}