27 条题解

  • 1
    @ 2025-06-25 13:52:48
    #include<iostream>
    #include<string>
    using namespace std;
    
    string s;
    int len=1,i;
    int sum2[105]={0};
    int num[105]={0};
    int ans=1;
    int a[8]={1,3,1,9,9,7,9,1};
    int b[4]={2,4,8,6};
    
    void print(int x[]){
         int i=100;
         for(i=100;i>=0;i--)
         if(x[i]!=0) break;
         cout<<endl;
         while(i>=0) cout<<x[i--];
         cout<<endl;
    
         }
    
    //return x==t
    bool Equal(int x[],int t){
         for(int i=100;i>0;i--)
         if(x[i]!=0) return false;
         if(x[0]==t) return true;
         return false;
         }
    
    //z=y+t
    void add(int z[],int y[],int t){
         for(int i=0;i<=100;++i)
         z[i]=y[i];
         z[0]+=t;
         int i=0;
         while(z[i]>=10)
         {
           z[i+1]+=z[i]/10;
           z[i]%=10;
           i++;
                       }
         return ;
         }
    
    //x=x-y
    void Sub(int x[],int y[]){
         for(int i=0;i<=100;++i)
         {
           x[i]=x[i]-y[i];
           if(x[i]<0) {x[i]+=10;x[i+1]-=1;}
                 }
         return ;
         }
    
    //return (x-y-t)%m
    int SubAndMod(int x[],int y[],int t,int m){
        Sub(x,y);
        x[0]-=t;
        int i=0;
        while(x[i]<0)
        {
          x[i]+=10;
          x[i+1]-=1;
          i++;
                     }
    
        int tt=0;
        for(int i=100;i>=0;i--)
        {
           tt=tt*10;
           tt=(tt+x[i])%m;
                }
        return tt;
        }
    
    //y=x/k
    void Divide(int y[],int x[],int k){
         int t=0;
         for(int i=100;i>=0;i--)
         {
           y[i]=(t+x[i])/k;
           t=(t+x[i])%k;
           t*=10;
                 }
         }
    
    //g(x)=1*3*5*7*9....*(2*x-1)
    int g(int x[]){
        if(Equal(x,1)) return a[0];
        if(Equal(x,2)) return a[1];
        int y[105]={0},z[105]={0};
        add(y,x,2);    //y=x+2
        Divide(z,y,5); //z=y/5  z为5的指数
        Sub(sum2,z);   //2的指数减去5的指数
    
        int t=SubAndMod(x,z,1,8);   //t=(x-(x+2)/5-1)%8
        return (g(z)*a[t])%10;
        }
    
    
    
    //y=y+x
    void Sum(int y[],int x[]){
         for(int i=0;i<=100;++i)
         {
           y[i]=y[i]+x[i];
           y[i+1]+=y[i]/10;
           y[i]%=10;
                 }
    
         }
    
    //f(x)=x!
    int f(int x[]){
        if(Equal(x,1)) return 1;
        int y[105]={0};
        Divide(y,x,2);   //y=x/2
        Sum(sum2,y);     //加上2的指数
        if(x[0]%2==0) return (f(y)*g(y))%10;
        int z[105]={0};
        add(z,y,1);
        return (f(y)*g(z))%10;
        }
    
    
    int main()
    {
        cin>>s;
        for(len=1;len<=s.size();len++)
        if(s.size()%len==0)
        {
           for(i=0;i<s.size();++i)
           if(s[i%len]!=s[i]) break;
           if(i>=s.size()) break;
                   }
    
        for(i=0;i<len;++i)
        num[i]=s[len-i-1]-'0';
        ans=f(num);
    
        int z[105]={0};
        if(!Equal(sum2,0))
        ans=ans*b[SubAndMod(sum2,z,1,4)];
    
        ans%=10;
        cout<<ans<<endl;
    }
    
  • 0
    @ 2009-10-11 16:28:13

    我倒。硬着头皮交了N次的216.。。

    数组开小了O.O

  • 0
    @ 2009-10-11 16:09:15

    神了.....

    我交了1遍,通过人数中我出现了2次.......

  • 0
    @ 2009-09-13 19:57:17

    Orz楼下神牛,我传了8遍,结果高精度数组没清零

  • 0
    @ 2009-09-13 17:37:19

    3遍AC……

  • 0
    @ 2009-08-12 21:58:22

    大牛门用的都什么方法啊?

    我的方法只要那最小周期串长度>10就挂了

    =10也很危险

  • 0
    @ 2009-07-18 21:28:42

    周期可以是不完全的吗?

    比如说"12112"的最小可以看成是"121"吗?

  • 0
    @ 2009-07-13 09:31:29

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ├ 测试数据 11:答案正确... 0ms

    ├ 测试数据 12:答案正确... 0ms

    ├ 测试数据 13:答案正确... 0ms

    ├ 测试数据 14:答案正确... 0ms

    ├ 测试数据 15:答案正确... 0ms

    ├ 测试数据 16:答案正确... 0ms

    ├ 测试数据 17:答案正确... 0ms

    ├ 测试数据 18:答案正确... 0ms

    ├ 测试数据 19:答案正确... 0ms

    ├ 测试数据 20:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    就因为把>=打成=WA了2次......

    公式f(n)=f([n/5])*4^([n/10] mod 2)*f(n mod 10) mod 10

  • 0
    @ 2009-05-18 19:53:39

    这里的最小周期串是什么意思?131113111能不能把13111看成最小周期串?

  • 0
    @ 2009-03-16 16:47:27

    最小周期串一直求错!!

  • 0
    @ 2009-03-02 09:07:27

    program kk;

    var ss,s:string;

    n,l,i,j:integer;

    ji:longint;

    a:array[1..1000] of char;

    begin

    read(ss);

    l:=length(ss);

    for i:=1 to l do

    for j:=1 to l-i do

    if ss[1+j]=ss then

    begin

    n:=ord(ss)-ord('0');

    break;

    end;

    ji:=1;

    for i:=1 to n do

    begin

    ji:=ji*i;

    while ji mod 10=0 do ji:=ji div 10;

    if ji mod 100 then ji:=ji mod 10;

    end;

    str(ji,s);

    l:=length(s);

    for i:=1 to l do

    a[i]:=s[i];

    for i:=l downto 1 do

    if a[i]'0' then

    begin

    writeln(a[i]);

    exit;

    end;

    end.

  • 0
    @ 2009-02-16 14:13:29

    这题很难么?

  • 0
    @ 2009-02-15 14:34:35

    谁把第一个点的数据给我一下,死活不对。

  • 0
    @ 2009-02-14 21:49:28

    这解题报告很好很强大

  • 0
    @ 2009-02-14 10:30:25

    楼下的解题报告很精辟。

  • 0
    @ 2009-02-07 18:58:58

    VIJOS P1505 信息学老师的失误解题报告 http://plfxy.blog.hexun.com/29038074_d.html

  • 0
    @ 2009-02-05 15:19:48

    郁闷 哪里出错都不知道..

    好想要数据啊..

  • 0
    @ 2009-02-05 14:42:45

    我是时代中学,支持时代!!!

  • 0
    @ 2009-02-05 12:41:54

    ..我汗..麻烦..

  • 0
    @ 2009-02-05 11:19:13

    神奇的curimit大牛竟然用一句地核.将他原来长达500余的精彩题解覆盖了!!

    没他的题解想过此题恐怕有点难度..

信息

ID
1505
难度
8
分类
数论 点击显示
标签
递交数
441
已通过
50
通过率
11%
被复制
4
上传者