| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2415 人关注过本帖, 2 人收藏
标题:呼叫版主,貌似是数学题
只看楼主 加入收藏
a1004573547
Rank: 2
等 级:论坛游民
帖 子:78
专家分:25
注 册:2013-3-11
收藏
得分:0 
被好几道给卡了
2014-01-23 23:49
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这题的难度比我想象的要大,至今没有好的方法。置顶以博得高手的关注,希望能看到精彩的算法出现。

重剑无锋,大巧不工
2014-01-26 19:15
a1004573547
Rank: 2
等 级:论坛游民
帖 子:78
专家分:25
注 册:2013-3-11
收藏
得分:0 
没人。。。。。。
2014-01-30 16:40
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
重赏之下必有勇夫。

第一个完成该题目的人(AC),贴上来代码,我奖励1000专家分。

重剑无锋,大巧不工
2014-02-06 10:00
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
上不了贵校OJ,不知道能不能AC,而且由于是晚自习后回宿舍才看到这题,明天又要参加数学建模要早睡,所以有错误的话,请多担待

由题可知,子矩阵和可视为a和b两个数组两个区间和的积,分别称为sa和sb,那么c所有的因子都在sa和sb里
因为c很小,因子不到100个,所以可以直接枚举sa包含哪个因子,那么sb就包含剩下的
设sa能被t1整除,则sb应被t2=c/t1整除。这里可以分别统计a模t1的前缀和,设suma[i]表示(a[0]+...+a[i])%t1,若suma[i]=suma[j]且j<i,说明a[j+1]+...+a[i]能整除t1,也就是找到了一个sa。我们可以统计值为suma[i]的元素有几个,那么遍历一遍就能找到所有sa,sb同理。
要注意的是,对于能整除t1的t1`,找到的sa有一部分也在计算t1时找到了,也就是会重复计算,要去重
代码如下:
程序代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define SE second
#define FI first
#define MP(x,y) make_pair(x,y)
const int MAXN = 30010;
const int MAXM = 110;
const int MOD = 1000000007;
const int INF =1000000007;
int sa[MAXN];
int arr[MAXN],brr[MAXN],suma[MAXN],sumb[MAXN],cnta[MAXN],cntb[MAXN];
pair<int,int> pa[MAXM];
long long cal(int a,int b,int n,int m)
{
    int tmpsa=0;
    long long bnum=0;
    for(int i=a;i<MAXN;i+=a)
        tmpsa-=sa[i];
    memset(cnta,0,sizeof(cnta));
    memset(cntb,0,sizeof(cntb));
    suma[0]=arr[0]%a;
    for(int i=1;i<n;++i)
        suma[i]=(suma[i-1]+arr[i])%a;
    sumb[0]=brr[0]%b;
    for(int i=1;i<m;++i)
        sumb[i]=(sumb[i-1]+brr[i])%b;
    cntb[0]=1;
    for(int i=0;i<m;++i)
        bnum+=cntb[sumb[i]]++;
    cnta[0]=1;
    for(int i=0;i<n;++i)
        tmpsa+=(cnta[suma[i]]++);
    if(sa[a]==0)
        sa[a]=tmpsa;
    return bnum*tmpsa;
}
int main()
{
    int ncase,n,m,c,ptop;
    long long ans;
    scanf("%d",&ncase);
    while(ncase--)
    {
        ans=0;
        ptop=0;
        memset(sa,0,sizeof(sa));
        scanf("%d%d%d",&n,&m,&c);
        for(int i=0;i<n;++i)
            scanf("%d",&arr[i]);
        for(int i=0;i<m;++i)
            scanf("%d",&brr[i]);
        for(int i=1;i*i<=c;++i)
            if(c%i==0)
            {
                ans+=cal(c/i,i,n,m);
                pa[ptop++]=MP(c/i,i);
            }
        for(int i=0;i<ptop;++i)
            ans+=cal(pa[i].SE,pa[i].FI,n,m);
        cout<<ans<<"\n";
    }
    return 0;
}


酱油实习生
2014-02-06 23:07
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,来的早不如来的巧。这题被我置顶好长时间了都无人问津,这刚一悬赏就被你看到了。
以下是引用墨清扬在2014-2-6 23:07:32的发言:
设suma(i)表示(a(0)+...+a(i))%t1,若suma(i)=suma(j)且j<i,说明a(j+1)+...+a(i)能整除t1

就凭这句话,这1000分就是你的了。到下面的贴子里回复一下准备接分吧。

每个贴子最多只能放100分,呵呵,没办法只好开了十个。发完看了看还是挺壮观的

https://bbs.bccn.net/thread-427071-1-1.html
https://bbs.bccn.net/thread-427072-1-1.html
https://bbs.bccn.net/thread-427073-1-1.html
https://bbs.bccn.net/thread-427075-1-1.html
https://bbs.bccn.net/thread-427076-1-1.html
https://bbs.bccn.net/thread-427077-1-1.html
https://bbs.bccn.net/thread-427078-1-1.html
https://bbs.bccn.net/thread-427079-1-1.html
https://bbs.bccn.net/thread-427080-1-1.html
https://bbs.bccn.net/thread-427081-1-1.html

重剑无锋,大巧不工
2014-02-07 00:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
已经三天了,墨清扬还是不在服务区。自动结贴的时限是7天。

如果届时墨清扬还不来领分,欢迎各位在我给墨清扬的悬赏贴里回复,用你们真心的祝福以表彰墨清扬。悬赏的分数将在第6天散给各位。

重剑无锋,大巧不工
2014-02-10 17:15
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 15楼 墨清扬
同样也是刚参加完数模,刚刚睡醒。。

不知你选的哪道题?

致各位:
恐怕墨清扬还在睡觉。。。

有语云:天若有情天亦老,人若建模死的早。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-02-13 11:08
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,下次我放分前先约个时间。

重剑无锋,大巧不工
2014-02-15 11:36
xp0213
Rank: 7Rank: 7Rank: 7
来 自:湖北武汉
等 级:黑侠
威 望:1
帖 子:222
专家分:524
注 册:2011-10-26
收藏
得分:0 
2014-02-18 09:07
快速回复:呼叫版主,貌似是数学题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018603 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved