https://www.luogu.com.cn/problem/P7116 答案错误,其中的list在样例1里面限制最大为3,但在跑的时候list有的项超出了3,不知道为什么(小学生打暴力打不来) 大致思路是:用run函数确定每次的位置,然后暴力计算步数,最后加起来
//walk
#include<iostream>
#define ll long long
using namespace std;
const int N=1e6+10;
const ll mod=1e9+7;
ll n,k,sum=0;
ll a[N],w[N],c[N],d[N];
inline bool check(ll list[]){
for(ll i=1;i<=k;i++){
if(list[i]<1||list[i]>w[i]){
return false;
}
}
return true;
}
inline void run(ll list[],ll deep){
//cout<<deep<<' '<<list[1]<<' '<<list[2]<<endl;
if(deep!=k){
for(ll i=1;i<=w[deep+1];i++){
//cout<<" "<<list[1]<<' '<<list[2]<<endl;
list[deep+1]=i;
//cout<<deep+1<<' '<<i<<endl;
//cout<<deep+1<<' '<<list[1]<<' '<<list[2]<<endl;
run(list,deep+1);
}
return;
}
ll tmp=0;
//cout<<check(list)<<' ';
//cout<<list[1]<<' '<<list[2]<<endl;
do{
list[c[tmp%n]]+=d[tmp%n];
tmp++;
}while(check(list));
sum+=tmp;
//cout<<tmp<<endl;
return;
}
int main(){
cin>>n>>k;
for(ll i=1;i<=k;i++){
cin>>w[i];
}
for(ll i=0;i<n;i++){
cin>>c[i]>>d[i];
}
//cout<<"test"<<w[1]<<' '<<w[2]<<endl;
for(ll i=1;i<=w[1];i++){
a[1]=i;
run(a,1);
}
cout<<sum%mod;
return 0;
}