1. 程式人生 > >Wannafly挑戰賽22-A/B

Wannafly挑戰賽22-A/B

中間 ext scanf bject www 小寫 tar 一行 所有

鏈接:https://www.nowcoder.com/acm/contest/160/A
來源:牛客網

題目描述

有一個計數器,計數器的初始值為0,每次操作你可以把計數器的值加上a1,a2,...,an中的任意一個整數,操作次數不限(可以為0次),問計數器的值對m取模後有幾種可能。

輸入描述:

第一行兩個整數n,m
接下來一行n個整數表示a
1
,a
2
,...,a
n

1≤n≤100
1≤m,a
1
,a
2
,...,a
n
≤1000000000

輸出描述:

輸出一個整數表示答案
示例1

輸入

復制
3 6
6 4 8

輸出

復制
3
    令 g=gcd(a1,a2,,,,,,an) ,顯然 (k*g)%m 的不同個數就是答案,觀察之後發現這個式子是有循環節的,假設第一次出現循環的
位置是x,也就是說 x*g=0 (mod m) x*g+y*m=0 ,x的解 x=x0+k*(m/gcd(g,m)) ,其實答案就是 m/(gcd(g,m)。
  
 1        
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5
#include<queue> 6 #include<vector> 7 #include<cstdlib> 8 #include<map> 9 #include<set> 10 11 #include<bits/stdc++.h> 12 using namespace std; 13 14 #define LL long long 15 #define inf 0x3f3f3f3f 16 #define pii pair<int,int> 17 #define pb push_back 18
#define mp make_pair 19 LL gcd(LL a,LL b){ 20 return b==0?a:gcd(b,a%b); 21 } 22 int main(){ 23 int t,n,m,i,j,k; 24 while(scanf("%d%d",&n,&m)!=EOF){ 25 LL ans=m,a; 26 for(i=1;i<=n;++i){ 27 scanf("%lld",&a); 28 ans=gcd(ans,a); 29 } 30 cout<<m/ans<<endl; 31 } 32 return 0; 33 }




鏈接:https://www.nowcoder.com/acm/contest/160/B
來源:牛客網

題目描述



給一個含n個點m條邊的有向無環圖(允許重邊,點用1到n的整數表示),每條邊上有一個字符,問圖上有幾條路徑滿足路徑上經過的邊上的字符組成的的字符串去掉空格後以大寫字母開頭,句號 ‘.‘ 結尾,中間都是小寫字母,小寫字母可以為0個。

輸入描述:

第一行兩個整數n,m
接下來m行,每行兩個整數a,b和一個字符c,表示一條起點為a,終點為b的邊,邊上的字符是c
1 ≤ n, m ≤ 50000
1 ≤ a < b ≤ n
c可以是大小寫字母、句號 ‘.‘ 或空格(方便起見用 ‘_‘ 表示空格)

輸出描述:

輸出一個整數,表示答案對2
32
取模的結果
示例1

輸入

復制
6 11
1 2 A
1 2 _
3 4 _
2 4 B
2 3 a
2 3 _
2 4 b
4 5 .
3 5 .
2 5 .
5 6 _

輸出

復制16    


    
  
  ps:我想的復雜了,有個更簡單的dp是 f[i][0/1/2/3]表示第i個節點結尾的,符號是j類型的合法子串的數目,這樣就好寫多了>_<.

  先對這個DAG進行拓撲排序。  
  設置四個類型 0-[A-Z] 1-[a-z] 2-[.] 3-[_] f[j][k1][k2]表示以第j個字符結尾的,開頭是k1類型,結尾是k2類型的合法串的個數,答案就是SUM{f[i][0][2]}。轉移的時候如果多個‘_‘連著算作一個就好了,如果有合法串與"__"拼接,那麽直接略去‘_‘即可,也就是說長度大於1的串中不顯示‘_‘,單獨設置類型4只用作表示開頭指代這個狀態的子串長度是1.轉移的時候我直接枚舉所有情況,所以寫的很長,其實很多狀態都是無用的,但分析起來怕出錯就直接寫了。我轉移的時候忘記了小寫字母可以不存在,,比賽結束5min才發現然後1A......


  
  1        
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<queue>
  6 #include<vector>
  7 #include<cstdlib>
  8 #include<map>
  9 #include<set>
 10 
 11 #include<bits/stdc++.h>
 12 using namespace std;
 13 
 14 #define LL long long 
 15 #define inf 0x3f3f3f3f
 16 #define pii pair<int,int>
 17 #define pb push_back
 18 #define mp make_pair
 19 #define uint unsigned int
 20 uint f[50050][5][5]={0};
 21 vector<pii>e[50050];
 22 vector<int>vi;
 23 int in[50050];
 24 void topsort(int n){
 25     queue<int>q;
 26     for(int i=1;i<=n;++i){
 27         if(!in[i]) {q.push(i);vi.push_back(i);}
 28     }
 29     while(!q.empty()){
 30         int u=q.front();
 31         q.pop();
 32         for(int i=0;i<e[u].size();++i){
 33             pii _e=e[u][i];
 34             if(!(--in[_e.first])){
 35                 q.push(_e.first);
 36                 vi.push_back(_e.first);
 37             }
 38         }
 39     }
 40     //for(i=0;i<n;++i)cout<<vi[i]<<endl;
 41 }
 42 void solve(int n){
 43     uint ans=0;
 44     for(int i=0;i<n;++i){
 45         int u=vi[i];
 46         for(int j=0;j<e[u].size();++j){
 47             f[e[u][j].first][4][e[u][j].second]++;
 48         }
 49             for(int k1=0;k1<=4;k1++){
 50                 for(int k2=0;k2<4;++k2){
 51                     if(f[u][k1][k2]){
 52                         //cout<<u<<‘ ‘<<k1<<‘ ‘<<k2<<‘ ‘<<f[u][k1][k2]<<endl;
 53                         for(int j=0;j<e[u].size();++j){
 54                             //cout<<u<<‘ ‘<<e[u][j].first<<endl;
 55                             uint s=f[u][k1][k2];
 56                             if(e[u][j].second==0){
 57                             if(k1==4){
 58                                  if(k2==3)
 59                                     f[e[u][j].first][4][0]+=s;
 60                                }
 61                             }
 62                             else if(e[u][j].second==1){
 63                             if(k1==4){
 64                                 if(k2==0){
 65                                     f[e[u][j].first][0][1]+=s;
 66                                 }
 67                                 else if(k2==3){
 68                                     f[e[u][j].first][4][1]+=s;
 69                                 }
 70                             }
 71                             else{
 72                                 if(k1!=0)continue;
 73                                 if(k2==1)
 74                                     f[e[u][j].first][0][1]+=s;
 75                               }
 76                             }
 77                             else if(e[u][j].second==2){
 78                             if(k1==4){
 79                                 if(k2==0){
 80                                     f[e[u][j].first][0][2]+=s;
 81                                 }
 82                             }
 83                             else{
 84                                 if(k1!=0)continue;
 85                                 if(k2==1){
 86                                     f[e[u][j].first][0][2]+=s;
 87                                 }
 88                             }
 89                             }
 90                             else{
 91                             if(k1==4){
 92                                 if(k2==0){
 93                                     f[e[u][j].first][4][0]+=s;
 94                                 }
 95                                 else if(k2==3){
 96                                     f[e[u][j].first][4][3]+=s;
 97                                 }
 98                             }
 99                             else{
100                                 if(k1!=0)continue;
101                                 if(k2==1){
102                                     f[e[u][j].first][0][1]+=s;
103                                 }
104                                 else if(k2==2){
105                                     f[e[u][j].first][0][2]+=s;
106                                 }
107                             }
108                             }
109                         }
110                     }
111                 }
112             }
113     }
114     for(int i=1;i<=n;++i)ans+=f[i][0][2];
115     cout<<ans<<endl;
116 }
117 int main(){
118     int n,m;
119     int u,v,w;
120     char c;
121     cin>>n>>m;
122     while(m--){
123         //scanf("%d%d%c",&u,&v,&c);
124         cin>>u>>v>>c;
125         if(c>=A&&c<=Z) w=0;
126         else if(c>=a&&c<=z) w=1;
127         else if(c==.) w=2;
128         else w=3;
129         in[v]++;
130         e[u].push_back(mp(v,w));
131     }
132     topsort(n);
133     solve(n);
134     return 0;
135 }











Wannafly挑戰賽22-A/B