思路:
考虑从左至右依次向每个位置放置数字,对于第i个位置,以i为结尾的i个前缀和模P是不能相等的(因为不存在和为P的倍数的子串),所以第i个位置只能放置P - i个不同的数字。则答案就是(P - 1) * (P - 2) * ... * (P - n)。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll MOD = 1e9 + 7; 5 6 int main() 7 { 8 ll n, P; 9 while (cin >> n >> P) 10 { 11 if (n > P - 1) { cout << 0 << endl; continue; } 12 ll ans = 1; 13 for (ll i = P - 1; i > P - 1 - n; i--) 14 { 15 ans = ans * i % MOD; 16 } 17 cout << ans << endl; 18 } 19 return 0; 20 }