关闭

编程马拉松17C

54人阅读 评论(0) 收藏 举报

#include <algorithm>
#include <assert.h>
#include <complex>
#include <ctype.h>
#include <functional>
#include <iostream>
#include <limits.h>
#include <locale.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>
#include <vector>
//#include <unordered_set>
//#include <unordered_map>

#pragma warning(disable:4996)
using namespace std;

#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;
typedef pair <ldb, ldb> pdd;

int IT_MAX = 1 << 21;
const int MOD = 1000000007;
const int INF = 1034567891;
const ll LL_INF = 1234567890123456789ll;
const db PI = 3.141592653589793238;
const ldb ERR = 1E-12;
#define mem(x ,y ) memset(x , y , sizeof(x))
struct road{
    int x,y,w ;
}edg[50010];
ll w[105][105] ;
ll d[105][105][105] ;
ll sum[105] ;
const int mod = 1e9+7 ;
int n , m ;
void add(int s,int e,int w,int t){
    for(int z=1;z<=sqrt(w);z++)if(w % z == 0){
        int tmp1 = z , tmp2 = w / z ;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                ll sav1 = t * (d[tmp1][i][s] * d[tmp1][e][j] ) ;
                ll sav2 = t * (d[tmp2][i][s] * d[tmp2][e][j] ) ;
                d[tmp1][i][j] += sav1 ;
                if(tmp1 != tmp2) d[tmp2][i][j] += sav2 ;
                sum[tmp1] += sav1 ;
                if(tmp1 != tmp2) sum[tmp2] += sav2 ;
            }
        }
    }
}
int u[105] ;
int v[105] ;
void init(){
    for(int i=1;i<=100;i++) v[i] = 0 , u[i] = 1 ;
    u[1] = 1 ;
    for(int i=2;i<105;i++)if(!v[i]){
        for(int j=i;j<105;j+=i){
            v[j] = 1 ;
            if(j % (i*i) == 0) u[j] = 0 ;
            else u[j] *= -1 ;
        }
    }
}
int main() {
    init() ;
    cin >> n >> m ;
    for(int i=0;i<m;i++){
        scanf("%d%d%d" , &edg[i].x , &edg[i].y , &edg[i].w) ;
    }
    mem(d , 0) ;
    mem(sum , 0) ;
    ll ans = 0 ;
    for(int x=1;x<=100;x++){
        for(int i=1;i<=n;i++) d[x][i][i] = 1 ;
        for(int t=0;t<m;t++){
            if(edg[t].w % x == 0) d[x][edg[t].x][edg[t].y] ++ ;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++)if(i!=j&&k!=j&&i!=k){
                    d[x][i][j] += d[x][i][k] * d[x][k][j] ;
                    d[x][i][j] %= mod ; 
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)if(i!=j){
                sum[x] += d[x][i][j] ;
                sum[x] %= mod ; 
            }
        }
        ans += sum[x] * u[x] ;
    }
    cout << ((ans % mod)+mod)%mod << endl ;
    int Q ; cin >> Q ;
    int ta , tb ;
    for(int q=0;q<Q;q++){
        cin >> ta >> tb ; ta -- ;
        int ts = edg[ta].x ; int te = edg[ta].y ;
        add(ts , te , edg[ta].w , -1) ;
        add(ts , te , tb , 1) ;
        edg[ta].w = tb ;
        ans = 0 ;
        for(int i=1;i<=100;i++){
            ans += sum[i] * u[i] ;
        }
        cout << ((ans % mod)+mod)%mod << endl ;
    }
}

用题解的方法还是没过,现在写在这,以后可以看代码,

我用的题解方法。不取mod不超时。取mod就超时。日了狗。以后再看啊

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7440次
    • 积分:593
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条