365C

来源:互联网 发布:机票制作图片软件 编辑:程序博客网 时间:2024/04/30 01:59

感谢小宇哥耐心的指导,感觉自己脑子真是不转难过

题意:

给定一串字符串,按要求构成一个矩阵B  bij=si*sj。

按题意会得到 加入矩阵c满足和为a   c1+c2+c3+c4=s1*s2+s1*s1+s2*s1+s2*s2=(s1+s2)*(s1+s2)

那么只需要记录行列的区间和就好了(理解了半天,还多亏小宇哥告诉。。)

 在对行列记录时候,行和列等价,只有在行区间*列区间==a时候,满足题意。

两个数字记录与根号的关系

注意特判a=0

#include <iostream>#include <stdio.h>#include <algorithm>#include <queue>#include <cstring>#include <string>#include <cmath>using namespace std;long long   row[100005];long long  a[4005][4005];char s[5005];long long ans=0;long long  n,len;int main(){    cin>>n;    scanf("%s",s);    len=strlen(s);    for(int i=0;s[i];i++)        s[i]=s[i]-'0';    long long res=0;    double aim=sqrt(n);    if(n==0){    long long  zero=0,r=0;for(int i=0;i<len;i++){            res=0;for(int j=i;j<len;j++){res+=s[j];if(res==0){zero++;}elser++;}}ans=zero*zero+zero*r*2;        cout<<ans<<endl;        return 0;}    for(int i=0;i<len;i++)    {        res=0;        for(int j=i;j<len;j++)        {            res+=s[j];            if(res!=0&&n%res==0&&res<=aim )                {                    row[res]++;                }            if(res>aim)                break;        }    }    for(int i=0;i<len;i++)    {        res=0;        for(int j=i;j<len;j++)        {            res+=s[j];            if(res!=0&&n%res==0&&res>=aim)            {                long long  tep=n/res;                if(tep*tep==n)                {                    ans+=row[tep];                }                else                {                    ans+=2*row[tep];                }            if(res>n)                break;            }        }    }    cout<<ans<<endl;    return 0;}/*16439873893693495623498263984765*/

0 0
原创粉丝点击