[ARC147D] Sets Scores 题解
大致思路:
每个集合之间可能会有不同的数 kkk,而我们可以直接找出任意一个集合 SiS_iSi,找出它里面是否存在 kkk,找出所有的可能性 xxx。对于一个序列 SiS_iSi,它的可能性为 nmn ^ mnm,而一共不同的数会存在 n−1n - 1n−1 次的比较,因为是每相邻两个比较,所以总次数为 mn−1m ^ {n - 1}mn−1,合起来就为 nm×mn−1n ^ m × m ^ {n - 1}nm×mn−1,而由于数据过于大,我们要采用快速幂,并且最终注意变量类型。
如果以上方法不太懂可以使用列举的方法,一个个列举,接着和样例进行校对,接着得出规律。
当然如果比较空的时候也可以尝试一下打表。
代码实现:
#include<bits/stdc++.h>
using namespace std;
long long n,m,s;
const long long p=998244353;
long long f(long long a,long long b){
long long x=1,y=a;
while(b>0){
if(b%2==1){
x=(x*y)%p;
}
y=(y*y)%p;
b=b>>1;//位运算更快的除2,千万不要b>>1,会TLE的
}
return x;
}
int main(){
cin>>n>>m;
s=f(m,n-1)*f(n,m)%p;
cout<<s<<endl;
return 0;
}
这道题就完成啦!!!