栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3824 Fiber

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3824 Fiber

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <ctime>#include <vector>using namespace std;typedef long long LL;const int N = 50009;const LL M = 1000000007;inline void addIt(int &a, int b){    a += b;    if(a >= M) a -= M;}inline int sub(int a, int b){    a -= b;    if(a < 0) a += M;    if(a >= M) a -= M;    return a;}struct Num{    int p[11];    int allp;}num[N];struct Data{    int dp[N], div[N], all;}data[55], fb[55];int L[55], R[55];int ans[55];int n;vector<int> e[55];bool vis[55];int rcn, rcv;void print(){    for(int i = 0; i < n; i++)    {        printf("i = %dn", i);        for(int j = 0; j < 6; j++) printf("dp[%d] = %dn", j, data[i].dp[j]);    }}int rc(int i, int xs){    int t, r = 0;    for(; i < num[rcn].allp; i++)    {        if(xs * num[rcn].p[i] <= R[rcv]) t = data[rcv].div[xs * num[rcn].p[i]];        else t = 0;        addIt(r, sub(t, rc(i + 1, xs * num[rcn].p[i])));    }    return r;}void dfsTree(int pre, int now){    if(vis[now]) return;    vis[now] = true;    int i, siz = e[now].size();    for(i = 0; i < siz; i++) dfsTree(now, e[now][i]);    if(pre >= 0 && siz <= 1) for(i = L[now]; i <= R[now]; i++) data[now].dp[i] = 1;    else for(i = L[now]; i <= R[now]; i++)    {        data[now].dp[i] = 1;        for(int j = 0; j < siz; j++) if(e[now][j] != pre)        { rcn = i; rcv = e[now][j]; data[now].dp[i] = (LL)(data[now].dp[i]) * sub(data[e[now][j]].all, rc(0, 1)) % M;        }    }    data[now].all = 0;    for(i = 1; i <= R[now]; i++)    {        data[now].div[i] = 0;        for(int j = i; j <= R[now]; j += i) if(j >= L[now]) addIt(data[now].div[i], data[now].dp[j]);        if(i >= L[now]) addIt(data[now].all, data[now].dp[i]);    }}void dfs(int pre, int now, int deep){    dfsTree(-1, now);    int i, siz = e[now].size();    ans[now] = 0;    for(i = L[now]; i <= R[now]; i++) addIt(ans[now], (LL)data[now].dp[i] * i % M);    for(i = 0; i < siz; i++) if(e[now][i] != pre)    {        vis[e[now][i]] = false;        fb[deep] = data[e[now][i]];        vis[now] = false;        dfs(now, e[now][i], deep + 1);        data[e[now][i]] = fb[deep];        vis[e[now][i]] = true;    }}void init(){    int i, j, k;    for(i = 0; i < N; i++) num[i].allp = 0;    for(i = 2; i < N; i++) if(num[i].allp == 0) for(j = i; j < N; j += i) num[j].p[num[j].allp++] = i;}int main(){    init();    int T;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        int i, j, k;        for(i = 0; i < n; i++)        { scanf("%d", &L[i]);        }        for(i = 0; i < n; i++)        { scanf("%d", &R[i]); e[i].clear();        }        for(i = 0; i < n - 1; i++)        { scanf("%d %d", &j, &k); j--; k--; e[j].push_back(k); e[k].push_back(j);        }        memset(vis, false, sizeof(vis));        memset(data, 0, sizeof(data));        dfsTree(-1, 0);        dfs(-1, 0, 0);        for(i = 0; i < n - 1; i++) printf("%d ", ans[i]); printf("%dn", ans[i]);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号