AtCoder Beginner Contest 179 E - Sequence Sum (模拟)

-
题意:\(f(x,m)\)表示\(x\ mod\ m\),\(A_{1}=1\),而\(A_{n+1}=f(A^{2}_{n},M)\),求\(\sum^{n}_{i=1}A_{i}\).
-
题解:多算几个,会有一个循环节,直接模拟就好了.
-
代码:
ll n,x,m; ll mp[N]; vector<ll> a; int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); scanf("%lld %lld %lld",&n,&x,&m); ll pos=n; ll tmp=0; for(ll i=1;i<=n;++i){ if(i>1) x=x%m*x%m; tmp+=x; if(!mp[x]){ mp[x]=i; a.pb(x); } else{ pos=i; break; } } if(mp[x]==n){ printf("%lld\n",tmp); return 0; } ll res=0; for(ll i=0;i<mp[x]-1;++i){ res+=a[i]; } ll cnt=0; for(ll i=mp[x]-1;i<pos-1;++i){ cnt+=a[i]; } ll len=pos-mp[x]; ll times=(n-mp[x]+1)/len; ll rest=(n-mp[x]+1)%len; res+=cnt*times; for(ll i=mp[x]-1;i<mp[x]-1+rest;++i){ res+=a[i]; } printf("%lld\n",res); return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号