HDU 2802 F(N)(寻找循环节)

it2023-10-15  67

 

 按照题意打表 1e9 一定超时,所以一定存在规律,将上述公式化简为 f(n)=f(n-2)+3*n*(n-1)+1 后进行打表,找到循环节之后,问题就解决了

const int N=1e5+5; const ll mod=2009; int n,m,t; int i,j,k; int a[N]; ll dp[N],cur; void init() { dp[1]=1; dp[2]=7; for(i=3;i<=100000;i++){ k=i%mod; dp[i]=(dp[i-2]+3*k*(k-1)+1)%mod; //根据模运算性质,防止爆 int if(dp[i]==7 && dp[i-1]==1){ cur=i-2; //循环节 break; } } } int main() { IOS; init(); while(cin>>n,n){ cout<<dp[n%cur]<<endl; } //PAUSE; return 0; }

 

最新回复(0)