[ARC147D] Sets Scores 题解
大致思路:
每个集合之间可能会有不同的数 k k k,而我们可以直接找出任意一个集合 S i S_i Si,找出它里面是否存在 k k k,找出所有的可能性 x x x。对于一个序列 S i S_i Si,它的可能性为 n m n ^ m nm,而一共不同的数会存在 n − 1 n - 1 n−1 次的比较,因为是每相邻两个比较,所以总次数为 m n − 1 m ^ {n - 1} mn−1,合起来就为 n m × m n − 1 n ^ 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;
}
这道题就完成啦!!!