hihocoder1776 序列

思路:

考虑从左至右依次向每个位置放置数字,对于第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 }
原文地址:https://www.cnblogs.com/wangyiming/p/9282799.html