宣传下这个oj。
A
typedef long long LL ;
const LL mod = 1000000007LL ;
LL c[2028][2028] ;
void Getc(){
c[0][0] = 1 ;
for(int i = 1 ; i < 2028 ; i++){
c[i][0] = c[i][i] = 1 ;
for(int j = 1 ; j < i ; j++){
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % (mod - 1) ;
}
}
}
LL Pow(LL x , LL y){
LL s = 1 ;
for(; y ; y >>=1){
if(y&1){
s *= x ;
s %= mod ;
}
x *= x ;
x %= mod ;
}
return s ;
}
LL answer(LL n , LL m){
if(n == 1) return m ;
LL s = 1 ;
for(LL i = 1 ; i <= m ; i++){
s *= Pow(i , n * c[n-1+m-i-1][n-1-1] % (mod-1)) ;
s %= mod ;
}
return s ;
}
int main(){
Getc() ;
int t ; LL n , m ;
cin>>t ;
while(t--){
scanf("%lld%lld" ,&n , &m) ;
printf("%lld\n" , answer(n , m)) ;
}
return 0 ;
}
B
D
F
typedef long long LL ;
int c[20] ;
int judge(LL x){
int t = 0 , i ;
while(x){
c[t++] = x % 10 ;
x /= 10 ;
}
for(i = t-1 ; i >= 1 ; i--){
if(c[i] == 6 && c[i-1] == 1) return 1 ;
}
return 0 ;
}
const int inf = 1000000000 ;
int dp[6200] , father[6200] ;
int a[6200] ;
void make(){
int i , j , m = 0 ;
fill(dp , dp+6170 , inf) ;
memset(father , -1 , sizeof(father)) ;
for(i = 1 ; i <= 6161 ; i++){
if(judge(i)) a[m++] = i ;
}
dp[0] = 0 ;
for(i = 1 ; i <= 6161 ; i++){
for(j = 0 ; j < m && i >= a[j] ; j++){
if(dp[i] > dp[i - a[j]] + 1){
dp[i] = dp[i-a[j]] + 1 ;
father[i] = i - a[j] ;
}
}
}
}
void out(int x){
if(x){
out(father[x]) ;
printf(" %d" , x - father[x]) ;
}
}
int main(){
make() ;
int i , j , t ;
LL n , x , y ;
cin>>t ;
while(t--){
scanf("%lld" ,&n) ;
if(judge(n))
printf("1 %lld\n" , n) ;
else if(n <= 6161){
if(dp[n] == inf) printf("0") ;
else printf("%d" , dp[n]) , out( (int)n ) ;
puts("") ;
}
else{
x = 6100 ;
y = 61 ;
n -= 6161 ;
x += (n%100) ;
y += (n/100*100) ;
printf("2 %lld %lld\n" , x , y) ;
}
}
return 0 ;
}
G
const double EPS = 1e-12 ;
double add(double a, double b){
return (fabs(a + b) < EPS * (fabs(a) + fabs(b))) ? 0 : (a + b);
}
struct Point{
double x, y;
Point(){}
Point(double x, double y):x(x),y(y){}
double operator ^(Point a){
return add(x * a.y ,- y * a.x );
}
Point operator - (Point a){
return Point(add(x ,- a.x) , add(y ,- a.y)) ;
}
void read(){
scanf("%lf%lf" , &x ,&y) ;
}
};
struct Line{
Point st, ed;
Line(){}
Line(Point st, Point ed):st(st),ed(ed){}
bool intersection(Line l){
double d1 = (ed -st)^(l.st - st) , d2 = (ed - st)^(l.ed - st) ;
return d1 * d2 <= 0 ;
}
};
const int maxn = 58 ;
Point dot[maxn*4] ;
Line line[maxn] ;
int n ;
int answer(){
int i , j , k , t , s = 0 ;
for(i = 1 ; i <= 2*n ; i++){
for(j = i+1 ; j <= 2*n ; j++){
t = 0 ;
Line now = Line(dot[i] , dot[j]) ;
for(k = 1 ; k <= n ; k++){
t += now.intersection(line[k]) ;
}
s = max(s , t) ;
}
}
return s ;
}
int main() {
int t , i ;
cin>>t;
while(t--){
cin>>n;
for(i = 1 ; i <= n ; i++){
scanf("%lf%lf%lf%lf" ,&dot[i].x , &dot[i].y , &dot[i+n].x , &dot[i+n].y) ;
line[i] = Line(dot[i] , dot[i+n]) ;
}
cout<< answer() << endl ;
}
return 0;
}
const int maxn = 10008 ;
int n , m ;
int a[maxn] , b[maxn] , c[maxn] , in[maxn] ;
vector<int> lis , g[maxn] ;
int judge(int t){
int i , s = 0 ;
for(i = 1 ; i <= n ; i++){
g[i].clear() ;
in[i] = 0 ;
}
for(i = 1 ; i <= m ; i++){
if(c[i] > t){
g[b[i]].push_back(a[i]) ;
in[a[i]]++ ;
}
}
queue<int>q ;
for(i = 1 ; i <= n ; i++){
if(in[i] == 0) q.push(i) ;
}
while(! q.empty()){
int u = q.front() ; q.pop() ;
s++ ;
for(i = 0 ; i < g[u].size() ; i++){
int v = g[u][i] ;
if( --in[v] == 0 ) q.push(v) ;
}
}
return s == n ;
}
int answer(){
sort(lis.begin() , lis.end()) ;
int L = 0 , R = 1000000010 , M , i , s ;
while(L <= R){
M = (L + R) >> 1 ;
if(judge(M)){
s = M ;
R = M - 1 ;
}
else L = M + 1 ;
}
return s ;
}
int main(){
int t , i ;
cin>>t ;
while(t--){
scanf("%d%d" ,&n ,&m) ;
lis.clear() ;
for(i = 1 ; i <= m ; i++){
scanf("%d%d%d" , &a[i] , &b[i] , &c[i]) ;
lis.push_back(c[i]) ;
}
printf("%d\n" , answer()) ;
}
return 0;
}