CSU 1801: Mr. S’s Romance 1802: 小X的战斗力 1804: 有向无环图 1805: Three Capitals 1806: Toll

1801: Mr. S’s Romance

#include <stdio.h>
#include <string.h>
#include <iostream>
#define MAXN 1000005
using namespace std;

typedef long long LL;
bool isprime[MAXN];
int prime[MAXN];
int indexnum[MAXN];
int num;
const int TOP=80000;
const LL MOD=1000000000LL+7;

int get_prime()
{
    memset(isprime,true,sizeof(isprime));
    isprime[1]=false;
    for(int i=2;i*i<MAXN-4;i++)
        if(isprime[i])
            for(int j=2;i*j<MAXN-4;j++)
                isprime[i*j]=false;
    num=0;
    for(int i=1;i<MAXN-4;i++)
        if(isprime[i])
            indexnum[i]=num,prime[num++]=i;
    return num;
}

int a[TOP];

void deal(int x)
{
    for(int i=0;i<num;i++){
        if(isprime[x]){
            a[indexnum[x]]++;
            break;
        }
        while(x%prime[i]==0){
            a[i]++;
            x/=prime[i];
        }
        if(x==1)
            break;
    }
}

LL mul(LL x,LL n,LL mod)
{
    LL tmp=x;
    LL ans=1;
    while(n){
        if(n&1){
            ans*=tmp;
            ans%=mod;
        }
        tmp*=tmp;
        tmp%=mod;
        n>>=1;
    }
    return ans%mod;
}

int main()
{
    //freopen("in.data","r",stdin);
    get_prime();
    int T,K=1;
    for(cin>>T;T--;){
        int n;
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            int tmp;
            scanf("%d",&tmp);
            deal(tmp);
        }
        LL ans=1;
        for(int i=0;i<num;i++)
            if(a[i])
                ans=ans*mul(2,a[i]-1,MOD)%MOD;
        ans=(ans-1+MOD)%MOD;
        printf("Case #%d:\n%lld\n",K++,ans);
    }
    return 0;
}

1802: 小X的战斗力

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 0x3f3f3f3f

using namespace std;

int n,m;
int map[200][200];
int main()
{
    int test;
    scanf("%d",&test);
    while(test--)
    {
        memset(map,0,sizeof(map));
        int a,b;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);//a赢b 
            map[b][a]=1;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=n;k++)
                {
                    if(map[j][i]==1&&map[i][k]==1)
                    {
                        map[j][k]=1;
                    }
                }
            }
        }
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(map[j][i]==1&&map[i][j]==1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
        }
        if(flag==1)
        {
            printf("Wrong\n");
            continue;
        }
        int num=0;
        int is_sure1=1;
        for(int i=1;i<=n;i++)//判断i号点是不是确定的 
        {
            int is_sure=1;
            for(int j=1;j<=n;j++)
            {
                if(i==j)continue;
                if(map[i][j]==0&&map[j][i]==0)
                {
                    is_sure=0;
                    break;
                }
            }
            if(is_sure==1)num++;
        }
        int rank=1;
        for(int i=2;i<=n;i++)
        {
            if(map[1][i]==1)
            {
                rank++;
                continue;
            }
            if(map[i][1]==0)
            {
                is_sure1=0;
                break;
            }
        }
        if(is_sure1==0) printf("-1\n");
        else printf("%d\n",rank);
        printf("%d\n",num);
    }
}

1804: 有向无环图

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mo=1e9+7;
const int maxn=1e5+10;
int head[maxn],e[2*maxn],nex[2*maxn];
int a[maxn],b[maxn],vis[maxn],f[maxn];
int ans,tot;
void add_edge(int u,int v){
  e[tot]=v;nex[tot]=head[u];head[u]=tot++;
}
 
void dfs(int u){
  int v,i;
  f[u]=0;vis[u]=1;
  if (head[u]==-1) {
    f[u]=b[u];
    return;
  }
  for (i=head[u];i!=-1;i=nex[i]){
    v=e[i];
    if (!vis[v]) dfs(v);
    f[u]=(f[u]+f[v])%mo;
  }
  ans=(ans+(long long)f[u]*a[u]%mo)%mo;
  f[u]=(f[u]+b[u])%mo;
}
int main()
{
    int i,n,m,u,v;
    while (scanf("%d %d",&n,&m)!=-1){
        for (i=1;i<=n;i++) head[i]=-1;
        tot=0;
        for (i=1;i<=n;i++){
            scanf("%d %d",&a[i],&b[i]);
        }
        for (i=1;i<=m;i++){
            scanf("%d %d",&u,&v);
            add_edge(u,v);
        }
        memset(vis,0,sizeof(vis));
        ans=0;
        for (i=1;i<=n;i++){
            if (!vis[i]) dfs(i);
        }
        printf("%d\n",ans);
    }
    return 0;
}

1805: Three Capitals

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")

using namespace std;
#define   MAX           100010
#define   MAXN          1000005
#define   maxnode       5
#define   sigma_size    30
#define   lson          l,m,rt<<1
#define   rson          m+1,r,rt<<1|1
#define   lrt           rt<<1
#define   rrt           rt<<1|1
#define   middle        int m=(r+l)>>1
#define   LL            long long
#define   ull           unsigned long long
#define   mem(x,v)      memset(x,v,sizeof(x))
#define   lowbit(x)     (x&-x)
#define   pii           pair<int,int>
#define   bits(a)       __builtin_popcount(a)
#define   mk            make_pair
#define   limit         10000

//const int    prime = 999983;
const int    INF   = 0x3f3f3f3f;
const LL     INFF  = 0x3f3f;
const double pi    = acos(-1.0);
const double inf   = 1e18;
const double eps   = 1e-6;
const LL     mod   = 1e9+7;
const ull    mx    = 133333331;

/*****************************************************/
inline void RI(int &x) {
      char c;
      while((c=getchar())<'0' || c>'9');
      x=c-'0';
      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
 }
/*****************************************************/

bool isFreeX[5];
LL A[5][5];
LL atob,atoc,btoa,btoc,ctob,ctoa;
LL gauss(int n, int m) {//求行列式
    for(int i = 0; i < m; ++i) isFreeX[i] = false;
    LL ret = 1, neg = 0;
    int r = 1, c = 1;//求n-1阶的行列式,去掉第一阶,所以从1开始
    for(; r < n && c < m; ++r, ++c) {
        int p = r;
        for(; p < n; ++p) if(A[p][c]) break;
        if(p == n) {--r; isFreeX[c] = true; continue;}
        if(p != r) {
            neg ^= 1;
            for(int i = c; i <= m; ++i) swap(A[p][i], A[r][i]);
        }

        //eliminate coefficient
        for(int i = r + 1; i < n; ++i) {
            while(A[i][c]) {
                LL delta = A[i][c] / A[r][c];
                for(int j = c; j <= m; ++j) {
                    A[i][j] += mod - delta * A[r][j] % mod;
                    A[i][j] %= mod;
                }
                if(!A[i][c]) break;
                neg ^= 1;
                for(int j = c; j <= m; ++j) swap(A[r][j], A[i][j]);
            }
        }
    }
    if(r != n) return 0;
    //0-r-1求n阶行列式,1-r-1求n-1阶行列式
    for(int i = 1; i < r; ++i) ret = ret * A[i][i] % mod;
    if(neg) ret = (-ret + mod) % mod;
    return ret;
}


int deg[5];
LL fact[MAX];

void init(){
    fact[0]=1;
    for(int i=1;i<=100000;i++) fact[i]=fact[i-1]*i%mod;
}

LL qpow(LL a,LL n){
    LL ans=1;
    while(n){
        if(n&1) ans=ans*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return ans;
}
LL C(int n,int m){
    return (fact[n]*qpow(fact[m],mod-2)%mod)*qpow(fact[n-m],mod-2)%mod;
}
int main()
{
    int a,b,c;
    init();
    while(cin>>a>>b>>c){
        LL ans=0;

        LL aa=a+b,bb=a+c,cc=c+b;
        if(aa%2||bb%2||cc%2){
            puts("0");continue;
        }

        for(int x=0;x<=a;x++)
        {
            atob=x;btoa=a-x;
            btoc=bb/2-btoa;atoc=aa/2-x;
            ctob=c-btoc;ctoa=b-atoc;

            if(atoc<0||atob<0||btoa<0||btoc<0||ctoa<0||ctob<0) continue;
            deg[0]=aa/2;
            deg[1]=bb/2;
            deg[2]=cc/2;

            for(int i=0;i<3;i++) A[i][i]=deg[i];
            A[0][1]=atob;A[0][2]=atoc;
            A[1][0]=btoa;A[1][2]=btoc;
            A[2][0]=ctoa;A[2][1]=ctob;
            LL ret=(C(a,x)*C(b,atoc)%mod)*C(c,btoc)%mod;
            ret=ret*gauss(3,3)%mod;
            for(int i=0;i<3;i++) ret=ret*fact[deg[i]-1]%mod;
            ret=ret*deg[0]%mod;

            ans+=ret;
            if(ans>=mod) ans-=mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}

1806: Toll

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <bitset>
#include <stack>
#include <map>
#include <climits>
#include <functional>

using namespace std;

#define LL long long
const int INF=0x3f3f3f3f;
const double eps=1e-8;

int n,m,t;
int s[20],nt[200],e[200],c[200],d[200],cnt;
int visit[20];
double dis[20];

double SPFA(double x)
{
    for(int i=0;i<=n;i++) dis[i]=1.0*INF;
    memset(visit,0,sizeof visit);
    queue<int>q;
    visit[1]=1;
    q.push(1);
    dis[1]=0;
    while(!q.empty())
    {
        int pre=q.front();
        q.pop();
        visit[pre]=0;
        for(int i=s[pre];~i;i=nt[i])
        {
            if(dis[pre]+c[i]*x+d[i]<dis[e[i]])
            {
                dis[e[i]]=dis[pre]+c[i]*x+d[i];
                if(!visit[e[i]])
                {
                    visit[e[i]]=1;
                    q.push(e[i]);
                }
            }
        }
    }
    return dis[n];
}

double get(double L,double R)
{
    return (R-L)*(SPFA(L)+4*SPFA((L+R)/2)+SPFA(R))/6;
}

double Ans(double L,double R)
{
    double mid=(L+R)/2;
    double s0=get(L,R),s1=get(L,mid),s2=get(mid,R);
    if(fabs(s0-(s1+s2))<=eps) return s0;
    else return Ans(L,mid)+Ans(mid,R);
}

int main()
{
    while(~scanf("%d%d%d",&n,&m,&t))
    {
        memset(s,-1,sizeof s);
        cnt=1;
        for(int i=1;i<=m;i++)
        {
            int u,v,cc,dd;
            scanf("%d%d%d%d",&u,&v,&cc,&dd);
            nt[cnt]=s[u],e[cnt]=v,c[cnt]=cc,d[cnt]=dd,s[u]=cnt++;
        }
        printf("%.8lf\n",Ans(0,1.0*t)/t);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80313881