Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("O3")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC optimize("no-stack-protector")
- #pragma GCC target("sse,sse2,ssse3,sse3,sse4,popcnt,avx,mmx,abm,tune=native")
- #include <bits/stdc++.h>
- using namespace std;
- // MODULAR TYPE *************************************************************************
- // -Source: https://codeforces.com/blog/entry/63903
- const int M=998244353;
- template<class T,T MOD=M>
- struct modular {
- T val;
- modular(T x=0){val=x%MOD;if(val<0)val+=MOD;}
- modular(T a,T b):val(0){*this+=a;*this/=b;}
- modular& operator+=(modular const& b){val+=b.val;if(val>=MOD)val-=MOD;return *this;}
- modular& operator-=(modular const& b){val-=b.val;if(val<0)val+=MOD;return *this;}
- modular& operator*=(modular const& b){val=(long long)val*b.val%MOD;return *this;}
- friend modular mpow(modular a,long long x) {
- modular ret=1;while(x){if(x&1)ret*=a;a*=a;x>>=1;}
- return ret;
- }
- friend modular inv(modular a){return mpow(a,MOD-2);}
- modular& operator/=(modular const& b){return *this*=inv(b);}
- friend modular operator+(modular a,modular const b){return a+=b;}
- friend modular operator-(modular a,modular const b){return a-=b;}
- friend modular operator-(modular const a){return 0-a;}
- friend modular operator*(modular a,modular const b){return a*=b;}
- friend modular operator/(modular a,modular const b){return a/=b;}
- friend std::ostream& operator<<(std::ostream& o,modular const& a){return o<<a.val;}
- friend bool operator==(modular const& a,modular const& b){return a.val==b.val;}
- friend bool operator!=(modular const& a,modular const& b){return a.val!=b.val;}
- };
- // **************************************************************************************
- //#define int long long
- const int N=200005;
- vector<modular<int>> f(N);
- modular<int> choose(int n,int k){
- return f[n]/(f[k]*f[n-k]);
- }
- signed main(){
- cin.tie(nullptr)->sync_with_stdio(false);
- int n,k;cin>>n>>k;
- int g=n-k; //number of files to be used
- if(g<1){cout<<"0\n";return 0;}
- f[0]=1;
- for(int i=1;i<=n;i++)f[i]=f[i-1]*i;
- modular<int> ans=choose(n,g);
- modular<int> tmp;
- for(int i=0;i<=g;i++){
- tmp+=((i&1)?-1:1)*choose(g,i)*mpow(modular<int>(g-i),n);
- }
- ans*=tmp;
- if(g!=n)ans*=2;
- cout<<ans<<"\n";
- }
Add Comment
Please, Sign In to add comment