一道acm題:戀愛指數——數學學不好就是一坨屎

 這個題目有很多高手都討論過了,不過都不夠詳細,我就談談怎樣解的吧。
    開始我用的是模擬,這樣有3個是超時的,於是我就手工模擬,比如:
a    b    c    d    e    f
a+b    b+c    c+d    d+e    e+f
a+2b+c    b+2c+d    c+2d+e    d+2e+f
a+3b+3c+d    b+3c+3d+e    c+3d+3e+f
a+4b+6c+4d+e    b+4c+6d+4e+f
    我們居然看到了熟悉的楊輝三角,熟悉二項式定理的人都知道,每一項的係數是C(0,n-2),C(1,n-2),...,C(n-2,n-2),而我們的問題就是求這些係數的個位。
    如果直接計算,時間和空間都不夠,不過我們可以發現,C(i,n-2)/C(i-1,n-2)=(n-i-1)/i,再利用某些人說的分解法就行了。我的方法是把n-i-1和i中的所有2和5提取出來單獨處理,然後求解個位。容易看到,兩個已知個位的奇數的商的個位是一定的(不過5的倍數會造成干擾)。
    因此,程序就出來了,容易得知這個算法的複雜度爲O(NlogN).以下程序在10個測試點中均只用了不到100ms
:

 

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. int f(int m,int n) 
  4.     if (n==1) return m; 
  5.     if (n==3) 
  6.        switch (m) 
  7.        { 
  8.               case 1:return 7; 
  9.               case 3:return 1; 
  10.               case 7:return 9; 
  11.               case 9:return 3; 
  12.        } 
  13.     if (n==7) 
  14.        switch (m) 
  15.        { 
  16.               case 1:return 3; 
  17.               case 3:return 9; 
  18.               case 7:return 1; 
  19.               case 9:return 7; 
  20.        } 
  21.     if (n==9) 
  22.        switch (m) 
  23.        { 
  24.               case 1:return 9; 
  25.               case 3:return 7; 
  26.               case 7:return 3; 
  27.               case 9:return 1; 
  28.        } 
  29. int main() 
  30.     char a[100004]; 
  31.     int s,n,i,n2=0,n5=0,r=1,t1=0,t2=0,c[4]={6,2,4,8},tmp1,tmp2,tmp3; 
  32.     scanf("%s",a); 
  33.     n=strlen(a); 
  34.     for (i=0;i<n;i++) a[i]-='0'; 
  35.     t1=a[0]+a[n-2]; 
  36.     t2=a[1]+a[n-1]; 
  37.     for (i=1;i<=n/2-1;i++) 
  38.     { 
  39.         tmp1=n-i-1;tmp2=i; 
  40.         while (tmp1%2==0) {n2++;tmp1/=2;} 
  41.         while (tmp1%5==0) {n5++;tmp1/=5;} 
  42.         while (tmp2%2==0) {n2--;tmp2/=2;} 
  43.         while (tmp2%5==0) {n5--;tmp2/=5;} 
  44.         r*=tmp1; 
  45.         r=f(r%10,tmp2%10); 
  46.         if (n5!=0) 
  47.         { 
  48.            if (n2!=0) tmp3=0; 
  49.               else tmp3=5; 
  50.         } 
  51.         else if (n2!=0) tmp3=r*c[n2%4]%10; 
  52.         else tmp3=r; 
  53.         t1+=(a[i]+a[n-2-i])*tmp3; 
  54.         if (t1>10000000) t1%=10; 
  55.         t2+=(a[i+1]+a[n-1-i])*tmp3; 
  56.         if (t2>10000000) t2%=10; 
  57.     } 
  58.     if (n%2==0) 
  59.     { 
  60.        i--;t1+=1000;t2+=1000; 
  61.        t1-=a[i]*tmp3; 
  62.        t2-=a[i+1]*tmp3; 
  63.     } 
  64.     t1%=10;t2%=10; 
  65.     s=t1*10+t2; 
  66.     if (s==0) s=100; 
  67.     printf("%d",s); 

 總結——出現錯誤時需要換個思想紙上驗證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章