Wannafly挑戰賽22-A/B
阿新 • • 發佈:2018-08-18
中間 ext scanf bject www 小寫 tar 一行 所有
示例1
鏈接:https://www.nowcoder.com/acm/contest/160/A
來源:牛客網
題目描述
有一個計數器,計數器的初始值為0,每次操作你可以把計數器的值加上a1,a2,...,an中的任意一個整數,操作次數不限(可以為0次),問計數器的值對m取模後有幾種可能。輸入描述:
第一行兩個整數n,m1
接下來一行n個整數表示a
,a
2
,...,a
n
1
1≤n≤100
1≤m,a
,a
2
,...,a
n
≤1000000000
輸出描述:
輸出一個整數表示答案
輸入
復制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