返回顶部

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;
    }
    
posted @ 2020-09-22 17:37  _Kolibri  阅读(172)  评论(0)    收藏  举报