/* sort/*
sort(a.begin(), a.end(), greater<int>()) ;
vector<int> vectorFromString(string s){
istringstream iss(s);
vector<int> ret;
int n;
while(!iss.eof()){
iss >> n;
ret.push_back(n);
}
return ret;
}
string concantenate(vector<string> strs){
int sz=0;
REP(i,strs.size()){
sz+=strs[i].size();
}
string ret(sz);
int pos=0;
REP(i, strs.size()){
REP(j, strs[i].size()){
ret[pos]=strs[i][j];
pos++;
}
}
return ret;
}
//数学
int extgcd(int a, int b, int &x, int &y){
int d=a;
if(b!=0){
d=extgcd(b, a%b, y, x);
y-=(a/b)*x;
}
else{
x=1,y=0;
}
return d;
}
int sum(vector<int>& seq){
int ret=0;
REP(i, seq.size())ret+=seq[i];
return ret;
}
ll truemod(ll n, ll m){
return (n%m+m)%m;
}
ll fact(int n){
if(n==0)return 1;
else return n*fact(n-1);
}
ll comb(vi xn){
int k=0;
REP(i,xn.size())k+=xn[i];
ll x=fact(k);
ll y=1;
REP(i,xn.size())y*=fact(xn[i]);
return x/y;
}
int isprime[8000];
vi make_primelist(int upto){
REP(i, upto){
isprime[i]=1;
}
FOR(p,2,upto){
if(p*p>upto)break;
if(isprime[p]==0)continue;
int k=p+p;
while(k<upto){
isprime[k]=0;
k+=p;
}
}
vi ret;
FOR(i,2,upto){
if(isprime[i]==1)ret.push_back(i);
}
return ret;
}
comb([2,3,4])=(2+3+4)!/(2!3!4!)
vvl mul(vvl a, vvl b){
int k=a.size();
vvl ret;
ret.resize(k);
REP(i,k)ret[i].resize(k);
REP(i,k) REP(j,k) REP(l,k) ret[i][j]=(ret[i][j]+a[i][l]*b[l][j])%mod;
return ret;
}
vvl powm(vvl s, vvl t, ll n){
if(n==0)return t;
if(n%2==0)return powm(mul(s,s), t, n/2);
else return powm(mul(s,s), mul(s,t), n/2);
}
//その他
AnagralListで使用。
string comp(string xs,vi xn,int th){
int k=0;
REP(i,xn.size())k+=xn[i];
if(k==0)return"";
REP(i,xs.size()){
char c=xs[i];
int m=xn[i];
if(m==0)continue;
xn[i]--;
ll g=comb(xn);
if(th<g){
string t;
t.push_back(c);
return t+comp(xs,xn,th);
}
xn[i]++;
th-=g;
}
}
struct ANT{
int x,y,dx,dy;
ANT(){x=0,y=0,dx=1,dy=0;}
void L(){
int ndx=-dy,ndy=dx;
dx=ndx;dy=ndy;
}
void R(){
L();L();L();
}
void W(){
x+=dx;y+=dy;
}
};
最終更新:2011年10月14日 00:43