题意:一个从0到p-1的圈,第一次走一步,第二次都两步,第三次走三步,以此类推。求走n次之后走过了多少个点。
题记:每次迭代2p次一定会循环,所以循环到2*p就可以了。
#include<iostream>
using namespace std;
typedef long long ll;
const int N=2e7+5;
ll p,n,cnt;
int vis[N];
int main(){
cin>>p>>n;
vis[0]=1;
ll x=min(n,2*p);
ll sum=0;
for(ll i=1;i<=x;i++){
sum=(sum+i)%p;
vis[sum]=1;
}
ll ans=0;
for(int i=0;i<p;i++)
ans+=vis[i];
cout<<ans<<endl;
return 0;
}