20200723T1 【NOIP2015模拟10.28A组】同余 Description Input Output Sample Input Sample Output Data Constraint  solution  记得取模 code

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

Input

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

Output

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

Sample Input

2
1 1 5 100
3
2 0 7 7
2 2

Sample Output

16
0

Data Constraint

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

 solution

日常先打指数暴力dfs水30分

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

 1 void dfs(int x, int y)
 2 {
 3     if(x == n + 1 && y == 1)
 4     {
 5         int sum = 0;
 6         for(R int i = 1; i <= n; i++)
 7         {
 8             int kkk = 1;
 9             for(R int j = 1; j <= a[i]; j++)
10             {
11                 kkk *= b[i][j];
12             }
13             sum = (sum + kkk) % p;
14         }
15         if(sum == c) ans++, ans %= m ;
16         return;
17     }
18     if(y == a[x])
19     {
20         for(R int i = 0; i < p; i++)
21         {
22             b[x][y] = i;
23             dfs(x + 1, 1);
24             b[x][y] = 0;
25         }
26         return;
27     }
28     for(R int i = 0; i < p; i++)
29     {
30         b[x][y] = i;
31         dfs(x, y + 1);
32         b[x][y] = 0;
33     }
34     return;
35 }
36 signed main()
37 {
38     freopen("congruence.in","r",stdin);
39     freopen("congruence.out","w",stdout);
40     read(t);
41     while(t--)
42     {
43         read(n); read(c); read(p); read(m );
44         ans = 0;
45         for(R int i = 1; i <= n; i++) read(a[i]);
46         dfs(1, 1);
47         writeln(ans);
48     }
49     return 0;
50 }

当n = 1 时

推一下性质

至此已经有50分了

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

 1 void dfs(int x, int y)
 2 {
 3     if(x == n + 1 && y == 1)
 4     {
 5         int sum = 0;
 6         for(R int i = 1; i <= n; i++)
 7         {
 8             int kkk = 1;
 9             for(R int j = 1; j <= a[i]; j++)
10             {
11                 kkk *= b[i][j];
12             }
13             sum = (sum + kkk) % p;
14         }
15         if(sum == c) ans++, ans %= m ;
16         return;
17     }
18     if(y == a[x])
19     {
20         for(R int i = 0; i < p; i++)
21         {
22             b[x][y] = i;
23             dfs(x + 1, 1);
24             b[x][y] = 0;
25         }
26         return;
27     }
28     for(R int i = 0; i < p; i++)
29     {
30         b[x][y] = i;
31         dfs(x, y + 1);
32         b[x][y] = 0;
33     }
34     return;
35 }
36 int ksm (int x,int y)
37 {
38     int res = 1;
39     while(y)
40     {
41         if(y & 1) res = res * x % m ;
42         x = x * x % m ;
43         y >>= 1;
44     }
45     return res;
46 }
47 signed main()
48 {
49     freopen("congruence.in","r",stdin);
50     freopen("congruence.out","w",stdout);
51     read(t);
52     while(t--)
53     {
54         read(n); read(c); read(p); read(m );
55         ans = 0;
56         for(R int i = 1; i <= n; i++) read(a[i]);
57         if(n == 1)
58         {
59             if(c != 0) writeln( ksm (p - 1, a[1] - 1));
60             else writeln( (ksm (p, a[1]) - ksm (p - 1, a[1]) + m ) % m );
61             continue;
62         }
63         dfs(1, 1);
64         writeln(ans);
65     }
66     return 0;
67 }

先挖坑,A了再来

————————————————————————————————————————分界线

要吐了。。

每运算一次都要取模!!!!!!

不然会炸。。。

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

 code的思路是另一种

20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

 20200723T1 【NOIP2015模拟10.28A组】同余
Description
Input
Output
Sample Input
Sample Output
Data Constraint
 solution
 记得取模
code

——转自mlg%%%

 记得取模

code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<queue>
 7 #include<vector>
 8 #include<stack>
 9 #include<set>
10 #include<deque>
11 #include<map>
12 using namespace std;
13 
14 template <typename T> void read(T &x) {
15     x = 0; int f = 1; char c;
16     for (c = getchar(); c < '0' || c > '9'; c = getchar()) if (c == '-') f = -f;
17     for (; c >= '0' && c <= '9'; c = getchar()) x = 10 * x + c - '0' ;
18     x *= f;
19 }
20 template <typename T> void write(T x){
21     if (x < 0) putchar('-'), x = -x;
22     if (x > 9) write(x / 10);
23     putchar(x % 10 + '0');
24 }
25 template <typename T> void writeln(T x) { write(x); putchar('
'); }
26 template <typename T> void writesn(T x) { write(x); putchar(' '); }
27 
28 #define int long long
29 #define inf 1234567890
30 #define next net
31 #define P 1000000007
32 #define N 50
33 #define mid ((l+r)>>1)
34 #define lson (o<<1)
35 #define rson (o<<1|1)
36 #define R register
37 
38 int t, n, c, p, m ;
39 int a;
40 int a1,a2,b1,b2,ansa,ansb;
41 int ksm (int x,int y)
42 {
43     int res = 1;
44     while(y)
45     {
46         if(y & 1) res = res * x % m ;
47         x = x * x % m ;
48         y >>= 1;
49     }
50     return res;
51 }
52 inline int modd(int x)
53 {
54     x = (x % m + m ) % m ;
55     return x;
56 }
57 signed main()
58 {
59     //freopen("congruence.in","r",stdin);
60     //freopen("congruence.out","w",stdout);
61     read(t);
62     while(t--)
63     {
64         read(n); read(c); read(p); read(m );
65         read(a);
66         ansa = a1 = a2 = modd(ksm(p - 1, a - 1));
67         ansb = b1 = b2 = modd(ksm(p, a) - ksm(p - 1, a));
68         for(R int i = 1; i < n; i++)
69         {
70             read(a);
71             a1 = modd(ksm(p - 1, a - 1));
72             b1 = modd(ksm(p, a) - ksm(p - 1, a)); 
73             a2 = ansa; b2 = ansb;
74             ansa = modd(modd(b1 * a2) + modd(b2 * a1) + modd(modd((p - 2) * a1) * a2));
75             ansb = modd(modd(b1 * b2) + modd(modd((p - 1) * a1) * a2));
76         }
77         if(c == 0) writeln(ansb);
78         else writeln(ansa);
79     }
80     return 0;
81 }