zoukankan      html  css  js  c++  java
  • Bubble Cup X

    B. Neural Network country
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes

    Due to the recent popularity of the Deep learning new countries are starting to look like Neural Networks. That is, the countries are being built deep with many layers, each layer possibly having many cities. They also have one entry, and one exit point.

    There are exactly L layers, each having N cities. Let us look at the two adjacent layers L1 and L2. Each city from the layer L1 is connected to each city from the layer L2 with the traveling cost cij for , and each pair of adjacent layers has the same cost in between their cities as any other pair (they just stacked the same layers, as usual). Also, the traveling costs to each city from the layer L2are same for all cities in the L1, that is cij is the same for , and fixed j.

    Doctor G. needs to speed up his computations for this country so he asks you to find the number of paths he can take from entry to exit point such that his traveling cost is divisible by given number M.

    Input

    The first line of input contains N (1 ≤ N ≤ 106), L (2 ≤ L ≤ 105) and M (2 ≤ M ≤ 100), the number of cities in each layer, the number of layers and the number that travelling cost should be divisible by, respectively.

    Second, third and fourth line contain N integers each denoting costs 0 ≤ cost ≤ M from entry point to the first layer, costs between adjacent layers as described above, and costs from the last layer to the exit point.

    Output

    Output a single integer, the number of paths Doctor G. can take which have total cost divisible by M, modulo 109 + 7.

    Example
    input
    2 3 13
    4 6
    2 1
    3 4
    output
    2
    Note

    This is a country with 3 layers, each layer having 2 cities. Paths , and  are the only paths having total cost divisible by 13. Notice that input edges for layer cities have the same cost, and that they are same for all layers.

    题意:

      给你一个起点,和一个终点

      中间这个图是L层的,每层到每层的每个点都有一条权值为b[i]的有向边

      起点到第一层每个点 也有一条权值为a[i]的有向边,最后一层每个点到终点也有一条权值为c[i]有向边,给出a,b,c,求出路径和能整除M的方案数

    #include <bits/stdc++.h>
    inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double pi = acos(-1.0);
    const long long INF = 1e18+1LL;
    
    const int N = 2000000, mod = 1000000007;
    
    struct Matix {
        LL arr[105][105];
    }fi,se,ff;
    
    int n,L,M;
    
    Matix multi (Matix a, Matix b,int p) {
        Matix ans;
        memset(ans.arr,0,sizeof(ans.arr));
        if(p) {
            for(int i = 0; i < M; i++) {
                for(int j = 0; j < M; j++) {
                    for(int k = 0; k < M; k++)
                        ans.arr[(i+j)%M][0] += (a.arr[i][k] * b.arr[k][j])%mod,
                    ans.arr[(i+j)%M][0] %= mod;
                }
            }
        }
        else {
            for(int i = 0; i < M; ++i) a.arr[i][0] = a.arr[0][i];
            for(int i = 0; i < M; i++) {
                for(int j = 0; j < M; j++) {
                    for(int k = 0; k < M; k++)
                        ans.arr[0][(i+j)%M] += (a.arr[i][k] * b.arr[k][j])%mod,
                    ans.arr[0][(i+j)%M] %= mod;
                }
            }
        }
        return ans;
    }
    
    Matix pows(Matix an,Matix a,LL x) {
        while(x) {
            if(x&1) an=multi(an,a,1);
            a=multi(a,a,0);
            x/=2;
        }
        return an;
    }
    int ar[N];
    int main() {
        cin >> n >> L >> M;
        for(int i = 1; i <= n; ++i) {
            int x;
            scanf("%d",&x);
            fi.arr[x % M][0] += 1;
        }
        for(int i = 1; i <= n; ++i) {
            int x;
            scanf("%d",&x);
            se.arr[0][x % M] += 1;
            ar[i] = x;
        }
        fi = pows(fi,se,L-2);
        memset(ff.arr,0,sizeof(ff.arr));
        for(int i = 1; i <= n; ++i) {
            int x;
            scanf("%d",&x);
            ff.arr[0][(x+ar[i]) % M] += 1;
        }
        fi = multi(fi,ff,1);
        LL ans = fi.arr[0][0];
        printf("%lld
    ",((ans)%mod+mod)%mod);
        return 0;
    }

     

      

  • 相关阅读:
    JGUI源码:右键菜单实现(12)
    JGUI源码:开发中遇到的问题(11)
    JGUI源码:prefixfree 这个库有时候会引起网页一直加载中(10)
    Ext.net按钮事件中使用Response.Redirect的一个问题
    JGUI源码:Tab组件实现(9)
    IE7下使用兼容Icon-Font CSS类
    JGUI源码:JS菜单动态绑定(8)
    JGUI源码:组件及函数封装方法(7)
    JQuery对象关系图
    JGUI源码:Accordion折叠到侧边栏实现(6)
  • 原文地址:https://www.cnblogs.com/zxhl/p/7496174.html
Copyright © 2011-2022 走看看