Cod sursa(job #1256004)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 5 noiembrie 2014 18:01:26
Problema Kperm Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DIM 50011
#define MOD 666013
using namespace std;
ifstream f("kperm.in");
ofstream g("kperm.out");
int n,c,k,r,q1,q2,q3,q4;

vector<int> p;
bitset<DIM> viz;

void ciur(){
    for(register int i=2;i<n+11;i++)
        if(!viz[i]){
            p.push_back(i);
            for(register int j=i+i;j<n+11;j+=i) viz[j]=1;
        }
}

inline int up(int a,int b){
    if(b==1)
        return a;
    else{
        int q=up(a,b/2);
        q*=q,q%=MOD;
        if(b%2) q*=a;
        return q%MOD;
    }
}

inline int factorial(int x){
    int i,k,t,sol=1;
    for(i=0;i<p.size() && p[i]<=x;i++){
        k=p[i],t=0;
        while(k<=x)
            t+=x/k,k*=p[i];
        sol*=up(p[i],t);
        sol%=MOD;
    }
    return sol;
}

long long F[DIM];

int main(void){

    f>>n>>k;
    if(!k){
        g<<"0";
        return 0;
    }
    F[0] = 1;
    for (int i=1;i<=n;i++)
        F[i] = F[i-1]*i%MOD;
    //ciur();
    r=n%k,c=n/k;
    q1=F[r],q2=F[k-r];
    q3=F[c+1],q3=up(q3,r);
    q4=F[c],q4=up(q4,k-r);
    q1=(((q1*q2)%MOD)*((q3*q4)%MOD))%MOD;
    g<<q1;
    return 0;
}